Web

Json Web Token

아나니리 2019. 12. 29. 17:36

JWT (JSON Web Token)는 당사자간에 정보를 안전하게 JSON 객체로 전송하기 위한 간결하고 독립적인 방법을 정의하는 공개 표준 (RFC 7519)입니다.

JWT 구조

xxxxx.yyyyy.zzzzz

Header

토큰의 유형과 서명된 알고리즘의 정보가 들어있습니다. (x)

Payload

전송하기를 원하는 정보가 담기는 부분입니다. 해당 정보는 변조로부터 보호되지만 누구나 읽을 수 있습니다. (y)

Signature

header와 payload를 가지고 지정된 알고리즘을 이용해서 만들어진 부분입니다. (z)

Java JWT 예시

Gradle

implementation 'com.auth0:java-jwt:3.8.3'

토큰 생성에 필요한 알고리즘 생성

Algorithm algorithmHS = Algorithm.HMAC256("secret");

secret에 암호화에 사용하고 싶은 key를 설정합니다.
(key가 노출되면 해당키로 유효한 토큰을 만들 수 있으니 보안에 신경 써야 합니다.)

토큰 생성

String token = JWT.create() 
    .withIssuer("auth0") // 미리 정의된 클레임 
    .withExpiresAt(new Date())
    .withClaim(key, value) // 사용자 정의 클레임 
    .sign(algorithm);

토큰을 생성할 때 서명에 생성한 알고리즘을 이용합니다.
토큰 생성에 권장되는 미리 정의된 몇몇의 정보나, 넣고 싶은 정보를 정의해서 넣을 수도 있습니다.

JWT.decode(token) // Payload의 정보를 디코드한다.

클레임들은 Payload에 들어가는 정보입니다. 간단하게 디코딩하여 값을 확인할 수 있으니 보안에 신경 쓰이는 정보는 넣지 않아야 합니다.

토큰 검증

JWTVerifier verifier = JWT.require(algorithm) 
    .withIssuer("auth0") 
    .acceptExpiresAt(30 \* 60) 
    .build();

verifier.verify(token);

payload의 정보는 공개된 정보이기 때문에 payload의 정보만으로 토큰을 검증하는 것은 위험합니다
토큰을 생성했을 때 사용한 알고리즘으로 검증기를 만들어야 합니다. 검증기를 만들 때 검증할 정보들을 설정할 수 있습니다.

withIssuer : 발행자가 'auth0'인지 확인
acceptExpiresAt : 토큰이 생성된지 '30분'이 지나지 않았는지 확인

 

 

출처
https://jwt.io/
https://github.com/auth0/java-jwt