JWT 정리 1 - JWT 란 무엇일까

Stateful, Stateless Server

  • State Serve
    : 클라이언트에게 요청 받을 때, 클라이언트 상태(쿠키 혹은 세션)를 저장하고 있다가 유용한 정보로 활용
  • Stateless Server
    : 클라이언트의 이전 상태(쿠키 혹은 세션)을 기록하지 않고, 서버는 클라이언트의 요청만으로 작업을 처리

 

Stateless 방식의 서버에서 토큰을 사용하는 이유

  • 확장성
    : 세션을 이용하여 클라이언트의 요청을 처리한다면, 많은 트래픽이 발생했을 때 서버에 부담을 줄 수 있습니다. 하지만 토큰을 사용한다면, 어떤 서버로 요청이 들어와도 문제가 발생하지 않으므로 확장성이 생김
  • 보안성
    : 클라이언트가 서버에 요청을 보낼 때 쿠키나 세션을 이용한 방식의 취약점을 보완할 수 있음

  ⇒ 위와 같은 이유에 덧붙여, http 프로토콜의 결함을 어느정도 보완하는 해결책으로 JWT 가 제시됩니다.

 

JWT(Json Web Token)

  • JWT(JSON Web Token)는 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 자체 포함된 방법을 정의 하는 개방형 표준( RFC 7519 )입니다.
  • JWT는 비밀( HMAC 알고리즘 사용)을 사용 하거나 RSA 또는 ECDSA를 사용하는 공개/개인 키 쌍을 사용하여 서명할 수 있습니다 .
  • JSON 개체로 만들어진 정보는 디지털 서명되어, 신뢰할 수 있습니다.

 

JWT 는 언제 사용해야 할까

  • 권한부여
    : 사용자가 로그인할 때 각 후속 요청에는 JWT가 포함되어 사용자가 해당 토큰으로 허용되는 경로, 서비스 및 리소스에 액세스할 수 있습니다.
  • 정보교환
    : JSON 웹 토큰은 공개/ 개인 키 쌍을 사용하여 JWT에 서명할 수 있기 때문에 당사자 간에 정보를 안전하게 전달할 수 있습니다.  또한 헤더와 페이로드를 사용하여 서명을 계산하므로 콘텐츠가 변조되지 않았는지 확인할 수도 있습니다.

 

JWT 구조

 

헤더(HEADER) -  ALGORITHM & TOKEN TYPE


  • typ: 토큰의 타입 지정 - JWT
  • alg: 해싱 알고리즘 지정. 보통 HMAC SHA256 혹은 RSA가 일반적으로 사용된다.
  • 헤더의 JSON은 최종적으로 Base64 URL 로 인코딩된다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

 

정보(PAYLOAD) - DATA


  • payload 은 클레임을 포함하고 있습니다.
  • 클레임은 클라이언트에 대한 정보나 추가 데이터에 대한 설명을 담고 있습니다.
    (* claim: 토큰에 담을 정보의 한 조각)

 

클레임

 

rfc7519

 

datatracker.ietf.org

  • 공개 클레임
    : JWT 사용자들이 마음대로 정의할 수 있으나, 충돌을 방지하기 위해 IANA JSON 웹 토큰 레지스트리에 정의하거나 충돌 방지 네임스페이스를 포함하는 URI로 정의해야 합니다.
  • 비공개 클레임
    : 등록, 공개된 클레임이 아닌 클라이언트와 서버의 협의하에 정보를 공유하기 위해 생성된 클레임입니다. 공개클레임과 다르게 중복된 이름으로 인한 충돌이 생길 수 있습니다.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

 

서명된 토큰의 경우 정보들은 보호되지만 누구나 읽을 수 있습니다. 암호화 되지 않은 경우 JWT의 정보나 헤더 요소에 공개되면 안되는 정보를 넣지 않아야합니다.

 

서명(SIGNATURE)


  • 헤더의 인코딩 값과 정보의 인코딩 값을 합친 후 주어진 비밀키로 해쉬를 하여 생성합니다.
  • HMAC SHA256 알고리즘을 사용한 경우, 다음과 같은 방식으로 서명이 생성됩니다.
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

 

 

1. 헤더와 정보의 인코딩 값 사이에 "." 을 넣어 합친다.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

 

2. 위 값을 비밀키로 해싱을 하고 base64 로 인코딩

 

3. 서명 생성

SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c​

 

서명은 메세지가 도중에 변경되지 않았는지 확인하는 데 사용되며 개인 키로 서명된 토큰의 경우 JWT를 보낸 사람이 누구인지도 확인할 수 있습니다.

 

참고사이트


https://jwt.io/

 

JWT.IO

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

jwt.io

https://velopert.com/2389

 

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

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

velopert.com

 

반응형