IT 개발 라이프/Back_End

JWT(JSON Web Token)

10Biliion 2024. 12. 5. 10:35

✨ JWT란 무엇인가요?

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

🧩 JWT를 사용하는 이유

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

JWT의 구조

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

  1. Header (헤더) 📊
    • alg: 서명에 사용할 알고리즘 (예: HMAC SHA256)
    • typ: 토큰의 유형 (항상 "JWT")
  2. { "alg": "HS256", "typ": "JWT" }
  3. Payload (페이로드) 🏢
    • 토큰에 담길 데이터 (예: 사용자 ID, 권한 정보 등)
    • 민감한 정보는 절대 포함하면 안 됩니다! 🛑
  4. { "sub": "1234567890", "name": "John Doe", "admin": true }
  5. Signature (서명) 🔒
    • 헤더와 페이로드를 조합한 후 비밀키로 서명합니다.
    • 이 서명을 통해 토큰이 위변조되지 않았음을 보장합니다.
  6. 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는 크기가 커질 수 있어 요청에 부담이 될 수 있습니다.
  • 강제 로그아웃 어려움: 토큰이 유효한 동안은 강제로 만료시키기 어렵습니다.

JWT 사용 시 주의사항

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

마무리 📝

JWT는 인증과 정보 교환을 효율적으로 처리할 수 있는 강력한 도구입니다. 하지만 단점과 보안 이슈를 잘 이해하고 적절히 사용해야 안전한 시스템을 구현할 수 있습니다. 🌐

궁금한 점이나 추가로 알고 싶은 내용이 있다면 댓글로 남겨주세요! 😊