참고자료
1. JWT란 무엇인가?
2. jjwt 공식 문서
JWT는 Json Web Token의 약자로 json객체를 이용해서 토큰 자체의 정보를 저장하고 있는 웹 토큰이다.
암호화된 토큰으로 복잡하고 읽을 수 없는 string 형태로 저장되어있다.
name / value
의 한 쌍으로 이뤄져있다.서버가 기존에 발급했던 JWT와 비교를 한다.
JWT를 탈취 당하면 다른 유저가 조작이 가능하기 때문에 JWT
에서는 유효시간을 짧게 가지고
Refresh token
을 이용한다.
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.3'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.3'
서명키 (비밀키) 생성
private SecretKey key = Jwts.SIG.HS256.key().build();
String jwt = Jwts.builder() // (1)
.header() // (2) optional
.keyId("aKeyId")
.and()
.subject("Bob") // (3) JSON Claims, or
//.content(aByteArray, "text/plain") // any byte[] content, with media type
.signWith(signingKey) // (4) if signing, or
//.encryptWith(key, keyAlg, encryptionAlg) // if encrypting
.compact(); // (5)
Content 방법
Jwt의 페이로드는 텍스트, 이미지, 문서등 여러가지로 설정 가능하다.
그럴때 사용하는것이 Content 방식이다.
byte[] content = "Hello World".getBytes(StandardCharsets.UTF_8);
String token = Jwts.builder()
.content(content, "text/plain")
.signWith(key)
.compact();
Claim 방법
Json Object로 페이로드를 구성 하고 싶을때 사용한다.
표준 클레임들이 있다.
String jws = Jwts.builder()
.issuer("me")
.subject("Bob")
.audience("you")
.expiration(expiration) //a java.util.Date
.notBefore(notBefore) //a java.util.Date
.issuedAt(new Date()) // for example, now
.id(UUID.randomUUID().toString()) //just an example id
json Object이기 때문에 커스텀 key/value
값을 클레임으로 넣을 수 있다.
String jws = Jwts.builder()
.claims(claims)
// ... etc ...
보통 JWS 방식을 많이 사용하므로 (Claim 방식) JWS방식만 적는다.
임의의 jwt (key를 이용해) 생성
SecretKey key =
Jwts.SIG.HS256.key().build();
String token = Jwts.builder()
// userId : userId값 으로 페이로드에 넣는다.
.claim("userId", userId)
// 위에서 만든 키로 서명한다.
.signWith(key)
// 만들기 (압축한다고 한다.)
.compact();
try catch문을 위해 변수 생성및 파싱
Jws<Claims> jwt;
try {
jwt = Jwts.parser()
// JWS일때는 같은 키를 사용해야 한다.
.verifyWith(key)
// parser를 빌드한다.
.build()
// 서명된 클레임(token)을 파싱한다.
.parseSignedClaims(token);
// 페이로드를 가져온다.
Object payload = jwt.getPayload();
// 페이로드를 출력한다. 출력 => "payload = {userId=1}"
System.out.println("payload = " + payload);
// JwtException 예외를 캐치한다. (읽기에 실패한다면!, 유효하지 않다면!)
} catch (JwtException e) {
throw new IllegalStateException("Invalid Token. " + e.getMessage());
}