JWT

종명·2021년 3월 12일
0
post-thumbnail

JWT (JSON Web Token)이란? (RFC 7519)

  • JWT는 Claim기반의 토큰으로 두 개체에서 JSON 객체를 사용하여 가볍고 자가 수용적인 (self-contained) 방식으로 정보를 안전하게 전달해 줍니다.

  • XML 웹 토큰인 SWT, SAML에 비해 JSON 웹 토큰인 JWT는 덜 장황하고 인코딩되면 크기가 작고, HTML, HTTP 환경에서 유리합니다.

JWT의 구조

  1. 헤더 (Header)
  • 헤더는 두가지 정보를 지니고 있습니다.
  • typ : 토큰의 타입
  • alg : Signiture 해싱 알고리즘, 일반적으로 HMAC-SHA256, RSA가 사용됩니다.
{ 
	"typ": "JWT",
	"alg": "HS256"
}
  1. 정보 (Payload)
  • Payload는 토큰에 담을 정보를 지닙니다.
  • 여기서 정보의 한 조각을 클레임(Claim)이라고 부르고, 이는 JSON형식으로 되어있습니다.
  • Payload 예시
{
	"iss": "codesoom.com",
	"exp": "1722290000000",
	"https://codesoom.com/claims": true,
	"userId": "JamieShin",
	"username": "Jamie"
}
  • 여기서 클레임은 크게 세 분류로 나뉘어져 있습니다.

    • 등록된 클레임 : iss, sub, aud, exp 등이 있으며 서비스에 필요한 정보가 아닌 토큰에 대한 정보를 담기 위해 이미 정해진 클레임들 입니다.

      {
          "iss": "codesoom.com",
          "exp": "1722290000000",
      }
    • 공개 클레임 : 공개용 정보를 위해 사용되며, 충돌 방지를 위해 URI 포맷을 이용합니다.

      {
          "https://codesoom.com/claims": true
      }
    • 비공개 클레임 : 보통 클라인언트와 서버간의 협의하에 사용되는 클레임 이름들 입니다. 공개 클레임과 달리 이름이 중복될수 있으니 사용에 유의해야 합니다.

      {
          "userId": "JamieShin",
          "username": "Jamie"
      }
  1. 서명 (Signature)
  • 서명은 JWT토큰의 마지막 부분이며 토큰을 인코딩하거나 유효성을 검증할 때 사용하는 고유한 암호화 코드입니다.
  • 위에서 만든 헤더(Header)와 페이로드(Payload)의 값을 각각 BASE64로 인코딩하고, 인코딩한 값을 비밀 키를 이용해 헤더(Header)에서 정의한 알고리즘으로 해싱을 하고, 이 값을 다시 BASE64로 인코딩하여 생성합니다.
  • 예를 들어 HMAC SHA256 알고리즘을 사용하려는 경우 서명은 다음과 같은 방식으로 생성됩니다.
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
  • 이렇게 만든 만든 해쉬를, BASE64로 인코딩 하면 토큰이 완성됩니다.

마지막으로 생성된 토큰은 HTTP 통신을 할 때 HTTP Header의 Authorization필드에 담겨서 보내집니다. 참고로 Bearer는 인증스킴으로 OAuth를 위해서 고안된 방법이고, RFC6750에 표준 명세서가 있습니다.

{ 
     "Authorization": "Bearer {생성된 토큰 값}",
}

참고

0개의 댓글