토큰기반인증

MIN·2025년 4월 6일

weekly

목록 보기
15/31

토큰 방식은 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
시그니쳐가 만들어지는 과정

  • Header + Payload + 서버만 알고 있는 비밀 키
  • 위 3가지를 헤더에 명시된 알고리즘을 사용해 해싱
    → 예: HMACSHA256
  • 이렇게 만든 해시 값이 시그니쳐가 된다.

    HMACSHA256(
    base64UrlEncode(header) + "." + base64UrlEncode(payload),
    secret
    )

시그니쳐의 역할은 클라이언트에서 토큰을 보내면 서버가 검증을 하게된다.
시그니쳐는 비밀키가 포함되어 만들어지기 때문에 위조를 시도하면 같은 시그니쳐를 만들수 없음.

정리
JWT는 상태 저장이 필요 없어 효율적임 하지만 -> 무효화 어려움,(탈취된 토큰은 만료 될 때 까지 계속 유효)
정보 노출 가능성(페이로드는 디코딩하면 내용을 볼 수있음) 등의 단점도 존재한다.

0개의 댓글