본문 바로가기

CS/네트워크

Json Web Token(JWT)

Json Web Token(JWT)

Json Web Token 이란?

Json Web Token은 정보를 안전하게 전달하기 위한 웹표준(RFC 7519)입니다.JWTJson객체를 사용하여 자가 수용적(Self-contained)인 방법으로 정보를 전달합니다. JWT는 디지털 서명이 되어있어 데이터의 신뢰성을 보장합니다. JWTHMAC 알고리즘을 사용하거나, RSA 혹은 ECDSA 를 통한 공개/비공개 키 쌍을 사용해 서명 할 수 있습니다.

 

JWT의 사용

  • Authorization: JWT를 사용하는 가장 일반적인 시나리오입니다. 사용자가 로그인 한 후의 각 요청은 JWT가 포함되어 사용자는 JWT를 통해 허용되는 경로, 서비스, 리소스에 액세스 할 수 있습니다.
  • Information Exchange: JWT는 당사자간 정보를 안전하게 전송할 수 있습니다. token에 서명이 되어 있기 때문에, 정보를 보낸 이가 바뀌진 않았는지, headerpayload를 통해 정보가 변조되지 않았는지 확인이 가능합니다.

 

JWT의 구조

출처: https://velopert.com/2389

JWT.구분자를 사용해 다음의 3가지 영역으로 나뉘어집니다.

 

  • Header
  • Payload
  • Signatue

각각의 문자열이 어떤 역할을 하는지 알아보겠습니다.

 

 

header

header는 두 가지 요소로 구성됩니다. 바로 algtyp인데요. typ은 token의 종류를, alg는 서명에 사용된 알고리즘을 지정합니다. 서명에 사용되는 알고리즘은 일반적으로 HMAC 알고리즘과 RSA 알고리즘이 사용됩니다.

아래는 JWTheader 예시입니다.

 

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

이 JSON은 Base64Url로 인코딩되어, JWT의 첫 부분을 형성합니다.

 

 

payload

JWT의 두번째 파트인 payload에는 토큰에 담을 정보가 들어있습니다. payload에 담기는 정보들을 클레임(Claims) 이라고 부릅니다. 클레임은 name / value 의 한 쌍으로 이루어져 있습니다. 클레임은 다음 3가지 분류로 나뉘어집니다.

 

  • Registered claims
    • 미리 정의 된 클레임의 집합입니다. Registered claims는 서비스와 관련된 정보가 아닌, JWT에 관련된 내용을 담습니다. Registered claims를 사용하는 것은 자유지만, 권장하고 있습니다. 대표적인 Registered claims는 아래와 같습니다.
      1. iss(Issuer): 토큰 발급자에 대한 정보를 담습니다.
      2. sub(Subject): 토큰 제목을 기록합니다.
      3. aud(Audience): 토큰을 받을 대상자에 대한 정보를 담습니다.
      4. exp(Expiration Time): 토큰의 만료시간을 저장합니다.
      5. nbf(Not Before): 토큰의 활성날짜를 의미합니다. nbf에 기재된 시간 이전에는 토큰을 사용할 수 없습니다.
      6. iat(Issued At): 토큰의 발행날짜를 의미합니다.
      7. jti(JWT ID): 토큰의 고유 아이디를 의미합니다. 주로 토큰의 중복방지를 위해 사용됩니다.

 

  • public claims
    • Public Claims는 사용자 정의 클레임입니다. 공개용 정보를 위해 사용되며, 클레임의 충돌을 피하기 위해 IANA JSON Web Token Registry 에 정의하거나, URI형식으로 정의하여야 합니다.
        {
            "https://mytodays.tistory.com/jwt_claims/is_admin": true
        }

 

  • Private claims
    • Private claims는 통신을 하는 양 측간 협의하에 사용되는 클레임입니다.
        {
          "user_email": "lacuna7304@gmail.com",
          "user_name": "dongjunLim"
        }

 

Signature

SignatureJWT의 마지막 부분입니다. Signatureheaderpayload의 값을 Base64로 인코딩하고, 비밀키를 통해, header에서 정의한 알고리즘으로 해싱합니다. 이렇게 만든 값을 다시 Base64형태로 변환합니다. 아래는 Signature의 과정을 나타낸 수도코드입니다.

 

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

이렇게 만든 header, payload, signature를 모두 합치면 하나의 Json Web Token이 완성됩니다.

 

 

 

다음은 JWT 공식사이트에서 만들어본 JWT입니다.

출처: https://jwt.io/#debugger-io

 

 

지금까지 Json Web Token의 개념과 구조를 알아보았습니다. Json Web TokenSelf-contained와 이를 통한 stateless 특성을 가지는 장점이 있지만, 토큰 자체에 정보가 담겨있다는 점과, 정보의 크기가 커질수록 통신비용이 증가한다는 단점이 있습니다. 따라서 JWT를 무작정 사용하는게 아니라 구현하고자 하는 서비스를 고려해 사용해야 합니다. 정보를 전송하는 방법은 JWT만 있는게 아니니까요.

 

참고자료

https://jwt.io/introduction/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

http://www.opennaru.com/opennaru-blog/jwt-json-web-token/

 

JWT (JSON Web Token) 이해하기와 활용 방안 - Opennaru, Inc.

JWT 는 JSON Web Token의 약자로 전자 서명 된 URL-safe (URL로 이용할 수있는 문자 만 구성된)의 JSON입니다.JWT는 속성 정보 (Claim)를 JSON 데이터 구조로 표현한 토큰으로 RFC7519 표준 입니다.

www.opennaru.com

https://velopert.com/2389

 

[JWT] JSON Web Token 소개 및 구조 | VELOPERT.LOG

지난 포스트에서는 토큰 기반 인증 시스템의 기본적인 개념에 대하여 알아보았습니다. 이 포스트를 읽기 전에, 토큰 기반 인증 시스템에 대해서 잘 모르시는 분들은 지난 포스트를 꼭 읽어주세�

velopert.com