CS/Security

[Security] JWT(JSON Web Token)의 구조와 구성 요소

leejunkim 2025. 9. 30. 11:10

WeeklyPaper: JWT(JSON Web Token)의 구조와 각 구성 요소가 어떤 역할을 하는지 구체적으로 설명하세요.


JWT (Json Web Token)은 웹 표준으로, 온라인 네트워크에서 정보를 안젆게 통신할 때 사용하는 인터넷 표준 토큰이다. 간결하고, URL에 안전하게 사용할 수 있다는 장점이 있다.

 

JWT의 구성

JWT는 3가지로 구성되어있다: 헤더(header), 페이로드 (payload), 서명 (Signature).

세 가지 주요 요소로 구성되고 각 구성은 . 마침표를 구분자로 사용한다.

  • 헤더 (header)
    • 일단적으로 토큰의 유형 (JWS,JWE)과 서명 알고리즘을 명시한다.이 JSON 객체는 Base64Url로 인코딩되어 JWT의 첫 번째 부분을 형성한다.
    • 일반적으로 두 가지 정보로 구성된다.
      • typ (Type): 토큰의 유형을 지정하며, JWT의 경우 항상 "JWT"이다.
      • alg (Algorithm): 서명을 생성하는 데 사용된 해싱 알고리즘을 지정한다. 예를 들어, HMAC SHA256의 경우 "HS256"으로, RSA의 경우 "RS256"으로 표시된다.
      • {
          "alg": "HS256",
          "typ": "JWT"
        }
  • 페이로드 (payload)
    • 페이로드는 토큰에 담아 전달할 실제 정보, 즉 클레임(Claim)을 포함하고 있다. 클레임은 사용자에 대한 정보나 토큰에 대한 추가 데이터를 나타내는 이름-값 쌍의 집합이다. 클레임에는 세 가지 유형이 있다.
      • 등록된 클레임 (Registered Claims): 토큰에 대한 정보를 제공하기 위해 미리 정의된 클레임 집합이다. 필수는 아니지만 권장되는 클레임들이며, iss (발급자), exp (만료 시간), sub (주제), aud (수신자) 등이 있다.
      • 공개 클레임 (Public Claims): 충돌을 방지하기 위해 IANA JSON 웹 토큰 레지스트리에 정의된 클레임들이나, URI 형식으로 정의하여 사용할 수 있다.
      • 비공개 클레임 (Private Claims): 클라이언트와 서버 간에 협의하여 사용하는 클레임이다. 공개 클레임과 달리 이름 충돌이 발생할 수 있으므로 주의해서 사용해야 한다.
    • 페이로드 역시 Base64Url로 인코딩되어 JWT의 두 번째 부분을 형성한다.
      • {
          "sub": "1234567890",
          "name": "John Doe",
          "admin": true
        }
  • 서명 (Signature)
    • 헤더와 페이로드를 결합한 후 지정된 알고리즘과 비밀 키 또는 공개 키로 서명한 값이다.
      1. Base64Url로 인코딩된 헤더를 가져온다.
      2. 점(.)을 추가한다.
      3. Base64Url로 인코딩된 페이로드를 추가한다.
      4. 이 문자열을 비밀 키를 사용하여 지정된 알고리즘으로 해싱한다.서명은 토큰의 무결성을 검증하는 데 사용된다. 인코딩된 헤더와 페이로드, 그리고 비밀 키(Secret Key)를 헤더에 명시된 알고리즘(alg)으로 해싱하여 생성한다.
    • 이 서명을 통해 수신자는 토큰이 전송 중에 변경되지 않았음을 확인할 수 있다.