✨ JWT란 무엇인가요?
JWT(JSON Web Token)는 웹 표준 RFC 7519에 정의된 JSON 기반의 토큰으로, 주로 사용자 인증 및 정보 교환에 사용됩니다. 🔐
🧩 JWT를 사용하는 이유
- 안전한 정보 교환: JWT는 디지털 서명이 포함되어 있어 데이터의 무결성을 검증할 수 있습니다.
- 세션 관리의 효율성: 서버에 상태를 저장하지 않고, 클라이언트 측에서 토큰을 관리합니다.
- 확장성: 다양한 플랫폼 간의 인증에 사용 가능하며 RESTful API에서 특히 유용합니다.
JWT의 구조
JWT는 크게 세 부분으로 나뉩니다:
- Header (헤더) 📊
- alg: 서명에 사용할 알고리즘 (예: HMAC SHA256)
- typ: 토큰의 유형 (항상 "JWT")
- { "alg": "HS256", "typ": "JWT" }
- Payload (페이로드) 🏢
- 토큰에 담길 데이터 (예: 사용자 ID, 권한 정보 등)
- 민감한 정보는 절대 포함하면 안 됩니다! 🛑
- { "sub": "1234567890", "name": "John Doe", "admin": true }
- Signature (서명) 🔒
- 헤더와 페이로드를 조합한 후 비밀키로 서명합니다.
- 이 서명을 통해 토큰이 위변조되지 않았음을 보장합니다.
- 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...
서버의 검증 과정
- 헤더와 페이로드의 서명을 확인합니다.
- 서명이 유효하면 요청을 처리합니다.
🔄 JWT vs 세션
✨ 공통점
- 인증: 둘 다 사용자 인증 상태를 관리하기 위해 사용됩니다.
- 유효 기간: 세션과 JWT 모두 만료 시간을 설정할 수 있습니다.
🔑 차이점
항목 | JWT | 세션 |
상태 저장 | 서버에 상태를 저장하지 않음 (Stateless) | 서버에서 상태를 관리 (Stateful) |
확장성 | 분산 시스템에서 쉽게 확장 가능 | 서버 간 동기화가 필요하여 확장성이 제한적 |
보안 | 민감한 정보를 페이로드에 저장하면 안 됨 | 서버에서만 상태 관리하여 민감 정보 저장 가능 |
저장 위치 | 클라이언트 측 (쿠키, 로컬 스토리지 등) | 서버 메모리 또는 데이터베이스 |
강제 로그아웃 | 만료 전까지 강제 로그아웃 어려움 | 서버에서 세션 삭제로 즉시 로그아웃 가능 |
🔎 어떤 것을 선택해야 할까?
- JWT: RESTful API, 분산 서버 환경, 모바일 앱과 같이 클라이언트가 상태를 관리해야 하는 경우.
- 세션: 전통적인 웹 애플리케이션, 민감한 정보를 다룰 때.
JWT의 장점과 단점
✅ 장점
- 스케일링에 유리: 서버가 세션 정보를 관리하지 않아도 됩니다.
- 유연성: 다양한 인증 시나리오에 활용 가능.
- 퍼포먼스: 데이터베이스 조회 없이도 토큰만으로 인증 가능.
❌ 단점
- 정보 노출: 페이로드는 Base64로 인코딩되어 쉽게 읽을 수 있으므로 민감한 정보는 저장하면 안 됩니다.
- 토큰 크기: JWT는 크기가 커질 수 있어 요청에 부담이 될 수 있습니다.
- 강제 로그아웃 어려움: 토큰이 유효한 동안은 강제로 만료시키기 어렵습니다.
JWT 사용 시 주의사항
- 비밀키 관리: 비밀키 유출을 방지해야 합니다. 🚫
- 토큰 만료 시간 설정: exp 클레임을 사용하여 토큰 유효 기간을 제한하세요.
- HTTPS 사용: 네트워크에서의 도청을 방지하기 위해 HTTPS를 사용하세요.
마무리 📝
JWT는 인증과 정보 교환을 효율적으로 처리할 수 있는 강력한 도구입니다. 하지만 단점과 보안 이슈를 잘 이해하고 적절히 사용해야 안전한 시스템을 구현할 수 있습니다. 🌐
궁금한 점이나 추가로 알고 싶은 내용이 있다면 댓글로 남겨주세요! 😊
'IT 개발 라이프 > Back_End' 카테고리의 다른 글
자바(Java)의 장단점 ! (1) | 2024.12.05 |
---|---|
자바(Java) Enum 이란? (0) | 2024.12.05 |
자바 Stream 이란? 🚀 (0) | 2024.12.04 |
자바에서 동적 바인딩과 정적 바인딩 이해하기 🐾✨ (0) | 2024.12.03 |
Feign Client란? 🤔 (0) | 2024.12.03 |