CS/웹

[JWT] JSON Web Token 소개 및 구조

바디스 2023. 1. 31. 10:52

서버(세션) 기반의 인증 시스템

[ 서버(세션) 기반 인증 시스템이란? ]

기존의 인증 시스템은 서버 기반의 인증 방식으로, 서버 측에서 사용자들의 정보를 기억하는 방식입니다. 사용자들의 정보를 기억하기 위해서는 세션을 유지해야 하는데, 메모리나 디스크 또는 데이터베이스 등을 통해 관리합니다. 서버 기반의 인증 시스템은 클라이언트로부터 요청을 받으면, 클라이언트의 상태를 계속해서 유지하고 이 정보를 서비스에 이용하는데, 이러한 서버를 Sateful 서버라고 합니다. 예를 들어 사용자가 로그인을 하면, 세션에 사용자 정보를 저장해두고 서비스를 제공할 때 사용하합니다. 이러한 서버 기반의 시스템은 다음과 같은 흐름을 갖고있습니다.

 

 

 

 

이러한 인증 장식은 소규모 시스템에서는 아직 많이 사용되고 있지만, 웹/앱 어플리케이션이 발달하게 되면서 서버를 확장하기가 어렵다는 등 다음과 같은 문제점을 보이기 시작했습니다.

 

  1. 세션
    사용자가 인증을 할 때, 서버는 이러한 정보를 저장해야 하고 이를 세션(Session)이라고 부릅니다. 대부분의 경우에는 메모리에 저장하는데, 로그인 중인 사용자가 늘어날 경우에는 서버의 RAM에 부하가 걸리게 됩니다. 이를 피하기 위해 데이터베이스에 저장을 하기도 하는데, 이러한 방식 역시 데이터베이스에 무리를 주게 됩니다.
  2. 확장성
    사용자가 늘어나게 되면 더 많은 트래픽을 처리하기 위해 여러 프로세스를 돌리거나 컴퓨터를 추가하는 등 서버를 확장해야 합니다. 세션을 사용한다면 세션을 분산시키는 시스템을 설계해야 하지만 이러한 과정은 매우 어렵고 복잡합니다.
  3. CORS(Cross-Origin Resource Sharing)
    웹 어플리케이션에서 세션을 관리할 때 자주 사용되는 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어 있습니다. 따라서 쿠키를 여러 도메인에서 관리하는 것은 번거롭습니다.

이러한 문제들 때문에 토큰 기반의 인증 시스템이 나오게 되었습니다.

 

JWT 란?

JWT(JSON Web Token)는 서로 간의 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 자체 포함된 방법을 정의하는 개방형 표준 (RFC 7519) 이 정보는 디지털 서명되어 있으므로 확인하고 신뢰할 수 있습니다.(토큰을 Client에 저장)

JWT는 비밀( HMAC 알고리즘 사용)을 사용하거나 RSA 또는 ECDSA 를 사용하는 공개/개인 키 쌍을 사용하여 서명할 수 있습니다.

 

한마디로, jwt는 session, cookie를 대신하는 의미가 있는 문자열 토큰입니다. 

 

JWT 장점

  • 사용자 인증에 필요한 모든 정보는 토큰 자체에 포함하기 때문에 별도의 인증 저장소가 필요 없음
  • 트래픽 대한 부담이 낮음
  • REST 서비스로 제공 가능

JWT 단점

  • Self-contained: 토큰 자체에 정보를 담고 있으므로 양날의 검
  • 토큰의 페이로드(Payload)에 3종류의 클레임을 저장하기 때문에, 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있음
  • 토큰은 클라이언트 측에서 관리해야 하기 때문에, 토큰을 저장해야 함

 

JWT 원리

 

 

JWT 구조

 

Header

typ: 토큰의 타입을 지정합니다. (JWT)

alg: 해싱 알고리즘을 지정합니다.  해싱 알고리즘으로는 보통 HMAC SHA256 혹은 RSA 가 사용

 

Playload

등록된 (registered) 클레임 - 토큰에 대한 정보들을 담기위하여 이름이 이미 정해진 클레임들
공개 (public) 클레임 - 서로 충돌이 일어나지 않는 이름을 가지고 있어야함 (URL로 작성)
비공개 (private) 클레임 - 등록된 클레임도, 공개된 클레임들도 아닌 양 측간에 (클라이언트 <->서버) 협의하에 사용되는 클레임

 

Signature

토큰을 검증 할 때 사용됨

헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성

 

Token 검증