반응형
JWT Token에 대해 알아보자
JWT Token
이란?JWT Token
구성JWT Token
인증 과정JWT Token
JAVA CODE 구현
JWT Token
이란?
- `JWT`(JavaScript Web Token)는 웹 애플리케이션에서 사용자 인증 및 정보 교환을 위한 토큰 기반 인증 방식입니다. `JWT`는 토큰 자체에 사용자의 클레임(claim) 정보를 포함하고 있으며, 이를 통해 서버 간의 신뢰성 있는 정보 교환을 가능하게 합니다.
- 서버의 상태를 유지하지 않고도 토큰을 사용하여 인증을 처리할 수 있습니다.
- 토큰을 사용하여 클라이언트와 서버간 인증을 할 수 있습니다.
JWT Token
구성
- Header(헤더): `JWT `토큰의 유형 및 해싱 알고리즘 정보를 담고 있습니다. 일반적으로 "alg"라는 키와 해싱 알고리즘 이름(ex: HMAC SHA256, RSA)을 포함합니다. 또한 "typ" 키를 사용하여 토큰의 타입을 명시할 수 있습니다.
- Payload(페이로드): 토큰에 담길 클레임 정보를 포함하고 있습니다. 클레임은 토큰에 대한 속성 및 값의 조합으로 구성됩니다. 예를 들어, 사용자 ID, 권한, 만료 일자 등을 포함할 수 있습니다. 페이로드는 토큰의 실제 데이터 부분이며, 인코딩된 형태로 전달됩니다.
- Signature(서명): 헤더와 페이로드를 기반으로 생성되는 서명입니다. 서버는 비밀 키를 사용하여 서명을 생성하고, 토큰을 검증할 때에도 이 비밀 키를 사용하여 서명의 유효성을 검증합니다. 서명은 헤더와 페이로드를 변조하지 않았음을 보장하고, 토큰이 송신자(서버)에서 생성된 것임을 확인할 수 있게 합니다.
JWT Token
과정
- 클라이언트가 인증을 위해 로그인 요청을 서버에 보냅니다.
- 서버는 로그인 정보를 검증하고, 유효한 경우 토큰을 생성합니다.
- 서버는 생성된 토큰을 클라이언트에게 반환합니다.
- 클라이언트는 서버로 요청을 보낼 때마다 JWT 토큰을 헤더에 포함하여 전송합니다.
- 서버는 받은 토큰을 검증하고, 페이로드에 포함된 클레임을 확인하여 인증과 권한 부여를처리 합니다.
JWT Token
JAVA CODE 구현
Maven 라이브러리 추가
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
JWT 생성
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Date;
public class JwtExample {
// JWT 비밀 키
private static final String SECRET_KEY = "keykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykey";
public static void main(String[] args) {
// JWT 토큰 생성
String token = createJwtToken("user@example.com");
System.out.println("JWT Token: " + token);
// 생성된 JWT 토큰 검증
boolean isValid = validateJwtToken(token);
System.out.println("JWT Token Validation: " + isValid);
}
// JWT 토큰 생성
public static String createJwtToken(String subject) {
SecretKey secretKey = Keys.hmacShaKeyFor(SECRET_KEY.getBytes(StandardCharsets.UTF_8));
String token = Jwts.builder()
.setSubject(subject)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1 hour
.signWith(secretKey, SignatureAlgorithm.HS256)
.compact();
return token;
}
// JWT 토큰 검증
public static boolean validateJwtToken(String token) {
SecretKey secretKey = Keys.hmacShaKeyFor(SECRET_KEY.getBytes(StandardCharsets.UTF_8));
try {
Jwts.parserBuilder()
.setSigningKey(secretKey)
.build()
.parseClaimsJws(token);
return true; // 서명이 유효한 경우 true 반환
} catch (Exception e) {
return false; // 서명이 유효하지 않은 경우 false 반환
}
}
}
반응형
'IT 지식' 카테고리의 다른 글
웹 접근성(Web Accessibility)이란 (8) | 2024.11.07 |
---|---|
WSL(Windows Subsystem for Linux) 설치 및 설정 (0) | 2024.10.29 |
[MATOMO] 마토모 HTTP -> HTTPS #SSL #matomo ssl (0) | 2022.12.22 |
[티스토리 구글 애드센스 정산하기] 지급계좌 등록 (6) | 2022.09.20 |
도커(Docker) VS 가상머신(Virtual Machine) (0) | 2022.08.16 |