[Server] JWT ( Json Web Token ) 란?

김지환·2023년 1월 15일
0

JWT ( Json Web Token ) 란?

사용자간의 정보교환을 안전한 JSON 객체로 전달하는 표준이다. ( open standard (RFC 7519) )

JWT 는 HMAC, RSA or ECDSA 등과 같은 secret 키를 사용하여 암호화하게 된다.

따라서 신뢰성있는 정보를 주고 받을 수 있게끔 해준다.

JWT는 언제 사용할까?

  • Authorization : 사용자가 로그인하면 이후의 각 요청의 헤더에는 JWT가 포함되어 사용자가 해당 토큰으로 허용된 경로, 서비스 및 리소스에 액세스할 수 있다.
  • Information Exchange : JWT은 당사자 간에 정보를 안전하게 전송하는 좋은 방법이다. 공용/개인 키 쌍을 사용하여 JWT를 서명할 수 있으므로 보낸 사람이 자신이 말하는 사람임을 확인할 수 있다. 또한 헤더와 페이로드를 사용하여 서명이 계산되므로 내용이 변조되지 않았는지도 확인할 수 있다.

JWT 의 구조

JWT 는 3가지 부분으로 구성이 돼있다.

  • Header
  • Payload
  • Signature
    각 부분들은 dot 으로 연결돼어져 있고 다음과 같은 형식이다.
xxxxx.yyyyy.zzzzz

header 는 보통 2개의 부분으로 이루어진다.
어떤 알고리즘을 사용했는지, 어떤 타입인지가 들어가 있다.

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

위와 같은 JSON 타입을 Base64URL 인코딩을 하고 JWT 의 첫 번째 부분에 들어간다.

Payload

JWT의 두 번째 부분으로 Claims 를 담고 있는 부분이다.
Claims 는 유저에 대한 정보와 그외 여러 정보들을 담고있는 실질적인 데이터가 들어있는 부분이라고 할 수 있다.
Claims은 3가지가 존재한다.

  • Registerd Claims: 토큰정보를 얻기위해 이미 공식적으로 정해진 claims이다.
    • iss (issuer): 발행인을 식별한다.
    • exp (expiration time): 만료시간을 표시한다.
    • sub (subject): 토큰의 제목을 표시한다.
    • aud (audience): 토큰의 대상자를 표시한다.
  • Public Claims: 사용자가 마음대로 작성할 수 있는 claims 이다. Claims 중복을 피하기 위해서 IANA JSON Web Token Registry 에 등록을 하거나 충돌방지 namespace를 포함하는 URI 형태로 작성해야함
    • { 
          "https://velog.io/jihwan94": true
      }
  • Private Claims: 사용에 동의한 사용자들 끼리 사용하는 Claims.

Payload 또한 Base64URL 인코딩을 하고 JWT의 두 번재 부분에 들어간다.

Signature

Signature은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다. 위에서 만든 Header와 Payload의 값을 각각 BASE64Url로 인코딩하고, 인코딩한 값을 비밀 키를 이용해 헤더(Header)에서 정의한 알고리즘으로 해싱을 하고, 이 값을 다시 BASE64Url로 인코딩하여 생성한다.

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

어떻게 사용하는가?

인증 과정중에서 유저가 로그인에 성공하게 되면 JWT 가 발급되게 된다. 그 후 유저가 인가가 필요한 route를 요청하게 되면 JWT를 보내야 한다.

JWT는 Header를 통해서 전송이되게 되고 다음과 같은 포맷으로 전송되는게 일반적이다.

Authorization: Bearer <token>

이와 같은 형태를 무상태성 인증이라고 하고 이를 통해서 서버의 확장이 더욱 편리해지게 된다. 서버가 유저의 상태정보를 가지고 있지 않아도 되기 때문에 이로 인한 제약이 사라지기 때문.

Reference

https://jwt.io/introduction

profile
Developer

0개의 댓글