백엔드 Back-end/네트워크 Network

Q. JWT(JSON Web Token)란?

Tap to restart 2022. 2. 6. 19:00
반응형

A. JSON 웹 토큰은 양 당사자 간에 전송되는 속성 정보(Claim)를 표현하는 단순하고, URL 안전한(URL로 이용할 수 있는 문자로만 구성된) 수단이다.

"JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties."
(출처: IETF JSON Web Token (JWT))
 
위 설명으로는 잘 이해가 되지 않는다.
실제 어떻게 구성되어 있는지 살펴보자.

JWT 구성

JWT 예

 

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6InRhcHRvcmVzdGFydCIsInJvbGUiOiJhZG1pbiIsInN0YXJ0X2F0IjoxNjQ0MTM3NDk1LCJleHAiOjE2NDQxNDc0OTV9.JMEPkGed0OPL1SFDoiLp4zTBYCR_tL6qyDnHIjvrMnE

 
JWT는 HEADER.PAYLOAD.VERIFYSIGNATURE 헤더.데이터.서명으로 구성한다.
. 을 기준으로 나눠져 있다.
Base64URL로 인코딩되어 있는 거라 JWT 토큰을 얻으면 데이터를 누구든지 확인할 수 있다. 따라서 중요한 정보를 데이터에 담으면 안 된다.
간단히 https://jwt.io/ 란 사이트에 위 JWT예를 넣어보면 데이터를 보여주는 것을 확인할 수 있다.
 

jwt.io JWT 디코딩 예

 

JWT 코드 예 파이썬

pyjwt 팩키지를 사용해서 구현한 예이다.

# pip install pyjwt

import time
import jwt

key = 'very_secret'
now = int(time.time())
exp = now + 10000
jwt_payload = {'id': 'taptorestart', 'role': 'admin', 'start_at': now, 'exp': exp}
encoded = jwt.encode(jwt_payload, key, 'HS256')
print(encoded)
public_key = 'very_secret'
decoded = jwt.decode(encoded, public_key, algorithms='HS256')
print(decoded)

결과 예

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6InRhcHRvcmVzdGFydCIsInJvbGUiOiJhZG1pbiIsInN0YXJ0X2F0IjoxNjQ0MTM3NzYxLCJleHAiOjE2NDQxNDc3NjF9.eu0z0poGh-oDhSgawe6F3AYzYx6oXafttTXma_gTKms
{'id': 'taptorestart', 'role': 'admin', 'start_at': 1644137761, 'exp': 1644147761}

 

JWT를 사용하는 이유는?

세션Session 기반 인증은 세션 정보를 서버 메모리나 데이터베이스에 저장한다. 서버 메모리에 저장하면서 서버를 여러 대 운영할 경우는 사용자 입장에서 로그인을 한번 했는데 또 해야하는 문제가 발생하게 된다. 데이터베이스에 저장해서 처리할 경우에는 데이터베이스에 부하가 늘어난다.
토큰은 서버에 부담이 없다. 클라이언트에서 저장해서 서버에 요청시 Headers에 Authrization(Key) Bearer JWT(Value) 를 넣어서 보내면 된다. 서버를 여러 대 운영할 경우에도 문제가 없다. 각 서버가 같은 키를 갖고 해당 키로 decode하면 된다. 마이크로 서비스 아키텍처(Micro Service Architecture)에서도 용이하다. 각 서비스의 서버가 같은 키를 갖고 있으면 요청을 받았을 때 요청한 해당 사용자와 권한을 확인할 수 있다.
 

참고

RFC7519  JSON Web Token (JWT)
위키백과 JSON 웹 토큰
REST JWT(JSON Web Token)소개 - #1 개념 소개
REST JWT(JSON Web Token)소개 - #2 node.js에서 JWT 사용하기JWT, 정확하게 무엇이고 왜 쓰이는 걸까?
[보안동향] 인증, '토큰' 방식 새롭게 뜬다! 안전한 사용법은?

 

반응형