JWT 란?

JWT(JSON Web Token)는 공개 표준인 RFC7519로, JSON 객체 형태로 당사자 간 정보를 안전하게 전송하기 위한 소혀의 자체 포함 형식으로 정의됩니다.

JWT는 두 당사자간에 전송할 클레임을 나타내는 URL에 안전(url-safe)한 압축 수단입니다. JWT의 클레임(claim; 페이로드의 한 조각)은 JWS(JSON Web Signature) 구조의 페이로드(payload; 정보) 또는 JWE(JSON Web Encryption) 구조의 JSON 개체로 인코딩되어, 클레임을 디지털 서명하거나 무결성을 보호할 수 있습니다. 메시지 인증 코드 (MAC; Message Authentication Code) 및(또는) 암호화를 사용합니다.

JWT의 장점으로는 수많은 프로그래밍 언어에서 지원되며, 자체가 모든 정보를 포함하는 자가수용적(self-contained) 특성을 지니며, HTML의 헤더 또는 URL의 파라미터로 쉽게 전송될 있습니다.

 

JWT의 구조

JWT의 구조는 헤더, 페이로드 및 서명  세 가지를 포함하는 구조를 준수해야 합니다.

[Base64Encoded(HEADER)].
[Base64Encoded(PAYLOAD)].
[Encoded(SIGNATURE)]

 

Encoded JWT 예제

다음은 클라이언트 요청을 기반으로 반환되는 인코딩된 전체 access_token 입니다.

 

헤더 (HEADER)

헤더는 일반적으로 토큰 유형(JWT; typ)과 사용중인 서명 알고리즘(alg) (예: HMAC SHA256 또는 RSA)의 두 부분으로 구성됩니다.

{
  "alg": "HS256",
  "typ": "JWT"
}

이 부분을 Base64로 인코딩합니다.

 

정보 (PAYLOAD)

토큰에 담을 정보를 페이로드(payload)라고 합니다. 페이로드는 클레임을 포함합니다. 클레임은 페이로드의 1조각을 의미하며, 이는 name / value 의 한 쌍으로 이루어져 있습니다. 클레임에는 등록된(reserved), 공개(public) 및 비공개(private)의 세 가지 유형이 있습니다 .

 

  • 등록된(reserved) 클레임 – 유용하고 상호 운용 가능한 클레임을 제공하기 위해 필수는 아니지만 권장되는 미리 정의된 클레임 집합입니다. 그중 일부는 iss (발행자; issuer), exp (만료 시간; expiration), sub (주제; subject), aud (대상자; audience)  등 입니다.
  • 공개(public) 클레임 – 공개 클레임들은 충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 합니다. 충돌을 방지하기 위해서는, 클레임 이름을 URI 형식으로 짓습니다.
  • 비공개(private) 클레임 – 등록된 클레임도아니고, 공개된 클레임들도 아닙니다. 클라이언트-서버 협의하에 사용되는 클레임 이름들입니다. 공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야 합니다.

 

등록된 클레임의 예제는 다음과 같습니다.

{
    "iss": "yoonbumtae.com",
    "exp": "1485270000000",
    "userId": "11028373727102",
    "sub": "bgsmm"
}

 

서명 (SIGNATURE) 

서명 부분을 만들려면 인코딩된 헤더, 인코딩된 페이로드, 비밀(secret), 헤더에 지정된 알고리즘을 가져와 야합니다.

예를 들어 HMAC SHA256 알고리즘을 사용하려는 경우 서명은 다음과 같은 방식으로 생성됩니다.

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

서명은 메시지가 변경되지 않았음을 확인하는 데 사용되며, 개인 키로 서명된 토큰의 경우 JWT의 발신자가 누구인지 확인할 수도 있습니다.

 

출처

문의 | 코멘트 또는 yoonbumtae@gmail.com




0개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다