JWT : JSON Web Token의 약자
- 데이터를 JSON 형태로 안전하게 주고 받기 위한 개방형 표준 (RFC 7519를 따르고 있음)
- 전자서명되어 위변조 불가
- 회원 가입, 로그인 등의 권한 부여(authorization) 과정에서 폭넓게 사용됨
- 토큰 자체에 정보를 포함할 수 있음 (payload)
Token이란
- 토큰은 세션과 달리 서버가 아닌 클라이언트에 저장됨
Authorization 활용 시나리오
- 유저가 한번 로그인하면, 이후의 모든 요청의 헤더에 JWT가 포함됨
- 이 토큰을 통해 유저가 허용된 라우트 및 리소스 등에 접근 가능 (서버가 토큰을 검증)
JWT 구조
1. Header
2. Payload
3. Signature
-> 토큰은 xxxxx.yyyyy.zzzzz 같은 모양을 갖는다
1. Header
헤더는 일반적으로 2가지로 구성된다
- 해시 알고리즘
- JWT 타입
{
"alg": "HS256", // 해시 알고리즘 (SHA256 or RSA 등)
"typ": "JWT" // JWT 타입
}
그리고 이 헤더는 Base64url로 인코딩되어 JWT의 1번째 부분을 형성한다
Base64 : 공통적으로 사용되는 아스키코드 0~64. 즉, 대소문자 알파벳, 숫자, +, /
Base64url : URL에서 오류 없이 사용 가능하도록 Base64에서 +, / 을 각각 -, _ 로 바꿈
2. Payload
- 서버에서 첨부한 유저 권한 정보 및 데이터가 담겨 있다
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
- 토큰이 암호화되면 변조로부터 보호된다.
- 하지만 암호화된 토큰도 누구나 읽을 수 있기 때문에, 암호화하지 않은 데이터를 payload에 넣어서는 안된다.
- payload도 Base64url로 인코딩된다
3. signature
- 인코딩된 헤더, 인코딩된 페이로드, 개인 키(secret)가 헤더에 지정된 hash 알고리즘을 통해 변환되어 생성된다
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
완성된 JWT
- Base64url(header) . Base64url(payload) . Base64url(signature) 형태로 만들어진다