JSON 웹 토큰(JSON Web Token, JWT, “jot”[1])은 선택적 서명 및 선택적 암호화를 사용하여 데이터를 만들기 위한 인터넷 표준으로, 페이로드는 몇몇 클레임(claim) 표명(assert)을 처리하는 JSON을 보관하고 있다.
이를테면 서버는 “관리자로 로그인됨”이라는 클레임이 있는 토큰을 생성하여 이를 클라이언트에 제공할 수 있다. 그러면 클라이언트는 해당 토큰을 사용하여 관리자로 로그인됨을 증명한다.
JWT는 크게 (Header , Payload , Sign) 3가지로 나뉘며 역할은 다음과 같다.
구조 | 표현 | 역할 |
---|---|---|
Header | { “alg” : “HS256”, “typ” : “JWT” } |
Token의 타입(jwt, jws 등)과 해시 암호화 알고리즘(HMAC/SHA256/RSA)으로 구성 Base64Url로 되어있지만 실제 데이터는 JSON 형태로 되어있음 |
Payload | { “loggedInAs” : “admin”, “iat” : 1422779638 } |
토큰에 담을 claim 정보(사용자 정보)를 포함. Payload에 담는 정보의 한 조각을 클레임이라 하고, key / value의 한 쌍으로 이루어져 있다. 토큰에는 여러개의 클레임을 넣을 수 OHeader와 Payload는 Base64Url로 되어있기 때문에, 기본적으로 디코딩 가능 |
Sign | HMAC-SHA256( secret, base64urlEncoding(header) + ‘.’ + base64urlEncoding(payload ) |
secret key를 포함해 암호화되어 있음 Header에 대한 Base64Url를 적용한 값과 payload에 대한 Base64Url를 적용한 값들을 Header에 구성된 알고리즘으로 적용한 결과값 => secret key로 암호화 (비밀키는 서버측에 존재) Header와 Payload 변조됐는지 검증 |
JSON 웹 토큰은 세션 상태를 포함할 수 있다. 그러나 프로젝트 요건이 JWT 기간 만료 이전에 세션 무효화를 허용하는 경우 서비스는 더 이상 토큰만으로 토큰 표명(token assertion)을 신뢰할 수 없다. 토큰에 저장된 세션이 폐지되지 않음을 확인하기 위해 토큰 표명은 데이터 스토어에 대해 검사되어야 한다. 이렇게 하면 토큰이 더 이상 무상태가 아니게 됨으로써 JWT의 주된 이점이 약화되는 결과를 낳는다.
적절히 설계할 경우 개발자는 일부 주의를 기울이면 알고리즘 취약성을 해결할 수 있다