Jin's Dev Story

[네트워크] JWT 토큰 본문

CS 지식/[네트워크]

[네트워크] JWT 토큰

woojin._. 2023. 7. 17. 14:45
  • Claim : key-value 형식으로 이루어진 한 쌍의 정보

JWT 토큰

  • JSON 포맷을 이용하는 Claim 기반의 웹 토큰
  • 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달함

1) 헤더(Header)

  • 토큰의 타입과 해시 암호화 알고리즘(방식지정)으로 이루어져 있음
  • alg : 서명 암호화 알고리즘(ex: HMAC SHA256, RSA)
  • typ : 토큰 유형

 

2) 내용(Payload)

  • 토큰에 사용자가 담고자 하는 정보를 담음
  • 내용에는 Claim이 담겨있고, JSON(Key/Value) 형태의 한 쌍으로 이루어져 있음
  • 클레임 단위
    • 등록된 클레임 (Registered Claim), 공개 클레임 (Public Claim), 비공개 클레임 (Private Claim)
    • 1) 등록된 클레임 (Registered Claim)
      • JWT 사양에 이미 정의된 클레임
      • iss : Issuer. 토큰 발급자
      • sub : Subject. 토큰 제목
      • aud : Audience. 토큰 대상자
      • exp : Expiration Time. 토큰 만료 시각. Numeric Date 형식.
      • nbf : Not Before. 토큰의 활성 시각. 쉽게 말해, 이 시각 전에는 토큰이 유효하지 않다는 의미, Numeric Date 형식
      • iat : Issued At. 토큰이 발급된 시각. Numeric Date 형식. 이 값으로 토큰이 발급된지 얼마나 오래됐는지 확인할 수 있음
      • jti JWT ID. JWT 의 식별자
      2) 공개 클레임 (Public Claim)
      • JWT를 사용하는 사람들에 의해 정의되는 클레임
      • 충돌 방지를 위해 URI 형태로 이름을 짓거나, IANA JSON Web Token Claims Registry 라는 곳에 직접 클레임을 등록
      3) 비공개 클레임 (Private Claim)
      • 서버와 클라이언트 사이에서만 협의된 클레임
      • 공개 클레임과 충돌이 일어나지 않게 사용하면 됨

3) 서명(Signature)

  • 토큰을 인코딩하거나 유효성 검증할 때 사용하는 고유한 암호화 코드
  • 헤더와 내용의 값을 인코딩함

 

주의사항

  • 무상태(Stateless) 한 특징을 가지고 있음
  • 서버에서는 아무런 정보도 가지고 있지 않으며, 토큰 자체의 만료일자까지 토큰 자신이 가지고 있음
  • 누군가 토큰을 탈취해간다면 누구나 토큰을 탈취 당한 사람의 계정에 접근할 수 있게 됨
  • 하지만, 서버에서는 JWT 가 만료될 때 까지 아무런 조치도 취할 수 없으며, 그저 바라만보고 있어야 함
  • 즉, 이미 발행된 토큰에 대해 서버는 아무런 제어도 할 수 없음

⇒ 취약점을 막기 위해 현재는 많은 서비스들이 Access Token 과 Refresh Token 을 함께 사용