JWT(JSON Web Token)는 JSON 객체로 당사자 간에 안전하게 정보를 전송하기 위해 사용되는 open standard이다. 주로 공간이 한정적인 환경인 HTTP Authorization 헤더나 URI query Parameters에 사용된다.
JWT는 Header, Payload, Signature로 이루어져 있다.
Header는 일반적으로 토큰의 타입과 사용 중인 서명 알고리즘(예: HMAC SHA256 혹은 RSA)으로 이루어져 있다.
{ "alg": "HS256", "typ": "JWT" }
{ "alg": "HS256", "typ": "JWT" }
Payload는 엔티티(주로 user)와 추가 데이터로 이루어진 claims을 포함한다.
{ "sub": "1234567890", "name": "John Doe", "admin": true }
{ "sub": "1234567890", "name": "John Doe", "admin": true }
주의 : 서명된 토큰은 변조로부터는 안전하지만 누구나 읽을 수 있기 때문에 암호화되지 않는 비밀 정보를 JWT의 Payload 혹은 Header에 넣으면 안된다.
Signature는 메시지가 도중에 변경되지 않았는지 확인하는 데 사용되며, 개인 키로 서명된 토큰의 경우 JWT의 발신자가 누구인지 확인할 수 있다. Signature 부분을 만들려면 인코딩된 헤더, 인코딩된 페이로드, 비밀, 헤더에 지정된 알고리즘을 가져와 서명해야 한다.
예를 들어, HMAC SHA256 알고리즘을 사용하는 경우 다음과 같은 방법으로 서명이 생성된다.
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
이 Header, Payload, Signature 부분을 다 합치면 '.'으로 구분된 3개의 Base64-URL 문자열이 되며 HTML 및 HTTP 환경에서 쉽게 전달할 수 있다.
Authentication에서는 사용자가 자격 증명을 사용하여 로그인하면 JWT가 반환된다.
주의 : 토큰은 자격 증명이므로 보안 문제를 방지하기 위해 주의해야 한다. 토큰을 필요한 시간보다 더 오래 보관하면 안 되고 중요한 세션 데이터를 브라우저 저장소에 저장하지 말아야 한다.
사용자가 proteted routes 및 resources에 접근할 때마다 Bearer 스키마를 사용하여 Authorization header에 JWT를 전송해야 한다.
헤더의 내용은 다음과 같다.
Authorization: Bearer <token>
Authorization: Bearer <token>
서버의 protected routes는 Authorization header의 JWT가 유효한지 확인하고, 유효하다면 사용자가 protected resources에 접근할 수 있도록 해야 한다.
참고: 토큰이 Authorization header로 전송되는 경우 쿠키를 사용하지 않으므로 CORS(Cross Origin Resource Sharing)는 문제가 되지 않는다.
# Contact : jyw966@naver.com
Copyright © doromo. All Rights Reserved.