토큰 방식은 JWT (Json Web Token)로
JWT의 구조는 3개의 부분으로 나뉘어 있고,
XXX.YYY.ZZZZ와 같이 두 개의 점을 기준으로 세 파트로 나눠져있다.
각 1.Header, 2.Payload, 3.(verify) Signature로 구분된다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySW QiOjEyMywicm9sZSI6InVzZXIiLCJleHAiOjE3MjUwMDAwM DB9.dQw4w9WgXcQKXcQ1B9WzAfRvW-ZfnXDcqIGF8N4n9eQ
임의로 만든 JWT토큰을 https://jwt.io 사이트에 들어가서 붙여넣으면 각각 파트의 정보를 확인 할 수 있음.
1. Header
{ "alg": "HS256", // 해싱 알고리즘 "typ": "JWT" // 토큰 타입 }헤더(Header)는 해싱 알고리즘과 토큰의 종류가 담겨져 있다.
토큰 값은 고정값인 JWT가 들어가게되고, alg은 3번의 시그니쳐를 만드는 알고리즘 방식
2. Payload
{ "userId": 123, "role": "user", "exp": 1725000000 }페이로드(Payload)는 JWT 토큰의 본문이다. 토큰에 담길 사용자 정보와 기타 데이터(Claim) 들이 포함됨.
userId: 해당 토큰을 발급받은 사용자의 고유 ID role: 사용자의 권한 정보 (예: 일반 유저, 관리자 등) exp: 토큰의 만료 시각을 나타내는 숫자 (Unix timestamp 형식)페이로드는 암호화되지 않고 인코딩만 되므로, 디코딩 하여 토큰의 유효기간을 조정 할 수 있다. 개인정보는 담지 않는게 좋음
3. Signature
시그니쳐가 만들어지는 과정
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
시그니쳐의 역할은 클라이언트에서 토큰을 보내면 서버가 검증을 하게된다.
시그니쳐는 비밀키가 포함되어 만들어지기 때문에 위조를 시도하면 같은 시그니쳐를 만들수 없음.
정리
JWT는 상태 저장이 필요 없어 효율적임 하지만 -> 무효화 어려움,(탈취된 토큰은 만료 될 때 까지 계속 유효)
정보 노출 가능성(페이로드는 디코딩하면 내용을 볼 수있음) 등의 단점도 존재한다.