JWT(1) - JWT 소개와 기본 개념

마라탕천재 ㅣ 2024. 8. 26. 22:43

1. JWT의 정의와 용도

JWT(JSON Web Token)란 JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. 즉, 토큰의 한 종류로, 일반적으로 클라이언트 측에서 로컬 스토리지나 쿠키 저장소를 사용하여 JWT를 저장한다.

여기서 Claim이란, JWT의 페이로드(payload) 부분에 포함되는 정보의 한 '조각'을 의미한다. 각 Claim은 이름-값 쌍(name-value pair)의 형태를 가지며, 토큰에 대한 설명이나 추가적인 데이터를 제공한다.

 

 

 

2. JWT를 사용하는 이유

JWT는 서버의 상태를 유지할 필요 없이 인증 정보를 관리할 수 있는데, 이를 무상태(stateless)라고 한다. 즉, 서버가 사용자의 세션을 기억하지 않아도 된다. 모든 필요한 정보가 JWT에 포함되어 있어서, 서버는 단순히 이 토큰을 받아 검증만 하면 된다. 이 방식 덕분에 서버가 많은 사용자를 동시에 처리해야 할 때 부담이 줄어든다는 장점이 있어 JWT를 사용한다.

 

 

 

3. JWT의 구조 (헤더, 페이로드, 서명)

토큰은 세 가지 파트를 점(.)으로 구분해 이어 붙여서 만들어진다. 서버는 비밀 키로 서명을 확인해 토큰의 유효성을 검사하고, 클라이언트는 해당 정보를 안전하게 전달받을 수 있다.

이미지 출처 : https://medium.com/dataseries/public-claims-and-how-to-validate-a-jwt-1d6c81823826

  1. Header (헤더): 토큰의 타입과 서명에 사용할 암호화 알고리즘을 정의한다. 이 경우에는 HS256이라는 HMAC SHA256 알고리즘을 사용한다.
  2. Payload (페이로드): 실제로 전송하려는 데이터를 담고 있다. 페이로드에 들어가는 데이터를 바로 Claim(클레임)이라고 하는 것이다. 여기서는 사용자 정보(예: sub라는 속성에 사용자 ID, name에 사용자 이름, iat는 발행 시간)를 포함한다. 이 정보는 Base64로 인코딩돼서 토큰에 들어가게 된다.
  3. Signature (서명): 보안성을 더하기 위해 사용하는데, 서버만 알고 있는 비밀 키(secret)를 이용해 서명을 생성한다. 이 서명을 검증함으로써 토큰이 위조되지 않았는지 확인할 수 있다. 여기선 HMACSHA256을 이용해서 헤더와 페이로드를 연결한 뒤 서명한다.

 

 

 

4. JWT vs 세션 기반 인증의 차이점

좌 : 세션 기반 인증 / 우 : 토큰 기반 인증

 

  세션 기반 인증 토큰 기반 인증
상태 유지 방식 유상태(stateful): 서버가 세션 정보를 저장하고 유지.
클라이언트는 세션 ID만 저장하고 서버에 요청할 때마다 세션을 조회.
무상태(stateless): 서버가 인증 상태를 유지하지 않음.
모든 인증 정보는 토큰에 포함되어 클라이언트에 저장됨.
저장 위치 서버 측 (세션 저장소에 세션 데이터 저장) 클라이언트 측 (로컬 스토리지, 쿠키 등)
스케일링 서버 확장에 불리: 세션 저장소를 여러 서버에 동기화해야 해서 복잡해짐. 서버 확장에 유리: 상태를 유지할 필요가 없기 때문에 여러 서버에 쉽게 확장 가능.
토큰 정보 포함 서버에 정보가 저장되어 있음.
클라이언트는 세션 ID만 가지고 있음.
모든 사용자 정보(클레임)가 토큰 안에 포함되어 전송됨.
토큰 크기 세션 ID는 작고, 최소한의 정보만 클라이언트에 저장됨. 일반적으로 크기가 크며, 서버 요청 시마다 포함됨.
보안 세션 ID만 유출되면 공격이 가능하지만, 서버 측에서 세션 만료나 무효화 가능. 서명으로 무결성을 보장하지만, 토큰 탈취 시 위험함.
만료 시간 필요.
만료 관리 서버에서 세션 만료 시간 관리.
서버에서 세션을 종료하거나 삭제 가능.
토큰 자체에 만료 시간 포함 (exp 클레임).
만료 후 재발급 필요.
재인증 서버에서 세션을 유지하는 한 유효.
세션이 만료되면 재인증 필요.
만료되기 전까지는 계속 유효하며, 토큰이 만료되면 다시 로그인 필요.
주요 사용처 전통적인 웹 애플리케이션, 서버 중심 구조 분산 시스템, 마이크로서비스, API 인증, SPA
서버 자원 사용 서버에 세션 정보를 저장해야 하므로 자원 소모가 있음. 서버 자원을 거의 사용하지 않음 (토큰 검증만 필요).

 

 

 

5. JWT의 장단점

장점

  • 자체 포함: JWT는 사용자 정보와 권한을 포함하고 있어서 별도의 데이터베이스 조회 >없이 인증할 수 있다.
  • 보안: 서명을 통해 데이터의 무결성을 보장하며, 필요한 경우 암호화하여 기밀성을 유
    지할 수 있다.
  • 유연성: 다양한 플랫폼과 언어에서 쉽게 사용할 수 있고, RESTful API와 잘 어울린다.
  • 상태 비저장: 서버가 세션 정보를 저장할 필요가 없어 확장성이 뛰어나다.

 

단점:

  • 토큰 크기: JWT는 다른 인증 방식에 비해 크기가 클 수 있어 네트워크 대역폭을 더 소
    모할 수 있다.
  • 만료 관리: 만료된 토큰을 강제로 폐기하기 어려워 보안 취약점이 발생할 수 있다.
  • 서명 알고리즘: 취약한 알고리즘을 사용할 경우 보안에 문제가 생길 수 있다.
  • 초기 설정: JWT를 구현하고 설정하는 과정이 복잡할 수 있다.