JSON Web Token (JWT)은 웹표준 RFC 7519로 두 개체에서 JSON 객체를 사용하여 가볍고 self-contained 방식으로 정보를 안정성 있게 전달해 준다.
JWT 구조
aaaaa.bbbb.cccc
헤더 정보 서명
헤더
typ : 토큰의 타입을 지정
alg: 해싱 알고리즘을 지정
{
"typ": "JWT",
"alg": "HS256"
}
정보(payload)
정보의 한조각을 클레임이라고 부르고 이는 name/value 한 쌍으로 이루어져 있다. 토큰에는 여러개의 클레임 들을 넣을 수 있다.
클레임의 종료는 세 분류로 나뉘어져 있다.
등록된 (registered) 클레임,
공개(public) 클레임,
비공개(private) 클레임
1.등록된 클레임 : 토큰에 대한 정보들을 담기 위하여 이름이 이미 정해진 클레임. 사용은 모두 선택적(optional)
항목
- iss : 토큰 발급자
- sub: 토큰 제목
- aud: 토큰 대상자
- exp: 토큰의 만료시간, 시간은 NumericDate 형식으로 되어있어야 하며 언제나 현재 시간보다 이후로 설정되어 있어야 한다.
- nbf: Not Before를 의미하며, 토큰의 활성 날짜와 비슷한 개념. 여기에도 NumericDate 형식으로 날짜를 지하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않는다.
- iat: 토큰이 발급된 시간(issued at), 이 값을 사용하여 토큰의 age가 얼마나 되는지 판단할 수 있다.
- jti: jwt의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용된다. 일회용 토큰에 사용하면 유용하다.
- 공개 클레임 : 충돌이 방지된 이름을 가지고 있어야하기 때문에 이름을 URI 형식으로 짓는다.
{
" https://velopert.com/jwt_claims/is_admin": true
}
- 비공개 클레임 : 클라이언트와 서버 합의하에 사용되는 클레임 이름들. 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야한다.
{
"username": "velopert"
}
ex) payload
{
"iss": "velopert.com",
"exp": "1485270000000",
" https://velopert.com/jwt_claims/is_admin": true,
"userId": "11028373727102",
"username": "velopert"
}
서명
헤더의 인코딩 값과, 정보의 인코딩 값을 합친 후 주어진 비밀키로 해쉬를 하여 생성
다양한 언어로 지원되는 jwt
출처
https://jwt.io/ https://velopert.com/2389 https://github.com/jwtk/jjwt