Web

JWT(JSON Web Token) 란?

10Biliion 2024. 12. 5. 10:35

 

JWT란 무엇인가요?

JWT(JSON Web Token)는 웹 표준 RFC 7519에 정의된 JSON 기반의 토큰으로, 주로 사용자 인증 및 정보 교환에 사용됩니다. 

JWT를 사용하는 이유

  • 안전한 정보 교환: JWT는 디지털 서명이 포함되어 있어 데이터의 무결성을 검증할 수 있습니다.
  • 세션 관리의 효율성: 서버에 상태를 저장하지 않고, 클라이언트 측에서 토큰을 관리합니다.
  • 확장성: 다양한 플랫폼 간의 인증에 사용 가능하며 RESTful API에서 특히 유용합니다.

JWT의 구조

JWT는 크게 세 부분으로 나뉩니다:

Header (헤더) 

  • alg: 서명에 사용할 알고리즘 (예: HMAC SHA256)
  • typ: 토큰의 유형 (항상 "JWT")
  1. { "alg": "HS256", "typ": "JWT" }
  2. Payload (페이로드) 
    • 토큰에 담길 데이터 (예: 사용자 ID, 권한 정보 등)
    • 민감한 정보는 절대 포함하면 안 됩니다! 
  3. { "sub": "1234567890", "name": "John Doe", "admin": true }
  4. Signature (서명) 
    • 헤더와 페이로드를 조합한 후 비밀키로 서명합니다.
    • 이 서명을 통해 토큰이 위변조되지 않았음을 보장합니다.
  5. HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )

⚙️ JWT의 전체 구조

JWT는 세 부분을 .(점)으로 구분한 문자열입니다:

header.payload.signature

예:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT 사용 예제

1. 로그인 시 JWT 발급하기

클라이언트가 서버로 로그인 요청을 보냅니다:

요청

POST /login
Content-Type: application/json

{
  "username": "johndoe",
  "password": "mypassword"
}

응답

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

2. 인증이 필요한 요청에 JWT 포함하기

클라이언트는 받은 JWT를 Authorization 헤더에 포함시켜 요청합니다:

요청

GET /protected
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

서버의 검증 과정

  1. 헤더와 페이로드의 서명을 확인합니다.
  2. 서명이 유효하면 요청을 처리합니다.

JWT vs 세션

공통점

  • 인증: 둘 다 사용자 인증 상태를 관리하기 위해 사용됩니다.
  • 유효 기간: 세션과 JWT 모두 만료 시간을 설정할 수 있습니다.

차이점

항목 JWT 세션
상태 저장 서버에 상태를 저장하지 않음 (Stateless) 서버에서 상태를 관리 (Stateful)
확장성 분산 시스템에서 쉽게 확장 가능 서버 간 동기화가 필요하여 확장성이 제한적
보안 민감한 정보를 페이로드에 저장하면 안 됨 서버에서만 상태 관리하여 민감 정보 저장 가능
저장 위치 클라이언트 측 (쿠키, 로컬 스토리지 등) 서버 메모리 또는 데이터베이스
강제 로그아웃 만료 전까지 강제 로그아웃 어려움 서버에서 세션 삭제로 즉시 로그아웃 가능

어떤 것을 선택해야 할까?

  • JWT: RESTful API, 분산 서버 환경, 모바일 앱과 같이 클라이언트가 상태를 관리해야 하는 경우.
  • 세션: 전통적인 웹 애플리케이션, 민감한 정보를 다룰 때.

JWT의 장점과 단점

✅ 장점

  • 스케일링에 유리: 서버가 세션 정보를 관리하지 않아도 됩니다.
  • 유연성: 다양한 인증 시나리오에 활용 가능.
  • 퍼포먼스: 데이터베이스 조회 없이도 토큰만으로 인증 가능.

❌ 단점

  • 정보 노출: 페이로드는 Base64로 인코딩되어 쉽게 읽을 수 있으므로 민감한 정보는 저장하면 안 됩니다.
  • 토큰 크기: JWT는 크기가 커질 수 있어 요청에 부담이 될 수 있습니다.
  • 강제 로그아웃 어려움: 토큰이 유효한 동안은 강제로 만료시키기 어렵습니다.

 

 

  1. 비밀키 관리: 비밀키 유출을 방지해야 합니다. 🚫
  2. 토큰 만료 시간 설정: exp 클레임을 사용하여 토큰 유효 기간을 제한하세요.
  3. HTTPS 사용: 네트워크에서의 도청을 방지하기 위해 HTTPS를 사용하세요.