-
JWT란? 🚀 특징과 보안 주의사항 완벽 정리!Developer 2025. 3. 19. 09:00728x90
1. JWT(Json Web Token)란?
JWT(Json Web Token)은 JSON 기반의 토큰을 사용하여 사용자 인증 및 정보 교환을 수행하는 방식입니다.
✅ 쉽게 말해?
"서버가 사용자를 인증하면, 토큰을 발급하여 클라이언트가 이후 요청 시 인증할 수 있도록 하는 방식!"
- "세션을 저장하지 않고, 자체적으로 정보를 포함하는 토큰!"
📌 JWT 사용 예제:
- 사용자가 로그인하면 서버가 JWT를 생성하여 클라이언트에게 전달 🎟️
- 클라이언트는 이후 요청마다 JWT를 포함하여 서버에 전송 🚀
- 서버는 JWT의 유효성을 확인하고 요청을 처리 🔒
2. JWT의 구조 🏗️
JWT는 헤더(Header), 페이로드(Payload), 서명(Signature) 3가지 파트로 구성됩니다.
Header.Payload.Signature
📌 1) Header (헤더)
- 토큰 유형(typ)과 해싱 알고리즘(alg)을 포함
{ "alg": "HS256", "typ": "JWT" }
📌 2) Payload (페이로드)
- 토큰에 담을 정보 (클레임, Claims)
- 예제:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
📌 3) Signature (서명)
- 토큰의 무결성을 보장하는 서명 (비밀 키를 사용하여 생성)
✅ 결론: JWT는 Base64 인코딩된 문자열이며, 디지털 서명을 포함하여 위변조를 방지!
3. JWT의 특징 🚀
✅ 1) 세션 관리 없이 인증 가능
- 세션을 저장할 필요 없이, 토큰을 통해 사용자 인증 진행
✅ 2) 무상태(Stateless) 및 확장성
- 서버가 세션 정보를 저장하지 않으므로 마이크로서비스와 분산 시스템에서 활용하기 적합!
✅ 3) 정보 포함 가능 (Self-contained)
- 토큰 자체에 사용자 정보가 포함되므로, 별도 DB 조회 없이 사용 가능!
✅ 4) 다양한 환경에서 사용 가능
- REST API, OAuth, GraphQL 등 다양한 환경에서 인증에 활용됨
4. JWT 보안 주의사항 ⚠️
🚨 1) 토큰 탈취 방지
- JWT는 URL, LocalStorage, 쿠키에 저장할 수 있지만 XSS 공격에 취약할 수 있음!
- 권장 저장 방식:
- HttpOnly Cookie에 저장 (XSS 방어)
- 필요 시 로컬 스토리지에 저장하되 보안 강화 필요
🚨 2) 서명(Signature)은 암호화가 아님!
- JWT는 서명(Signature)이 있어 무결성은 보장되지만, Payload 내용은 누구나 디코딩 가능
- 중요 정보(비밀번호, 금융 정보)는 JWT에 저장하면 안 됨!
🚨 3) 토큰 유효기간(Expiration) 설정 필수
- 짧은 만료 시간을 설정하고, 리프레시 토큰(Refresh Token)과 함께 사용
- 예제:
{ "exp": 1716239022 }
🚨 4) HTTPS 필수 사용
- JWT가 탈취되면 누구나 사용할 수 있으므로, HTTPS로 전송하여 중간자 공격(MITM) 방지
🚨 5) 블랙리스트 관리 필요
- JWT는 서버에서 세션을 저장하지 않기 때문에 사용자가 로그아웃해도 토큰이 유효함.
- 이를 방지하기 위해, 블랙리스트 또는 짧은 만료 시간 + 리프레시 토큰 전략 활용
5. JWT vs 세션 기반 인증 비교 📊
비교 항목 JWT 세션 기반 인증 서버 저장 여부 ❌ 저장 필요 없음 ✅ 세션 저장 필요 확장성 ✅ 뛰어남 (무상태) ❌ 확장성 낮음 보안 위험 ❌ 토큰 탈취 위험 존재 ✅ 서버에서 관리 가능 로그아웃 처리 ❌ 블랙리스트 필요 ✅ 세션 삭제 가능 사용 사례 API, 모바일 앱 일반 웹사이트 ✅ 결론:
- JWT는 무상태(Stateless) 인증이 필요할 때 적합
- 세션 기반 인증은 보안이 중요한 환경에서 유리함
6. JWT 사용 예제 💡
✅ JWT 생성 (Node.js + jsonwebtoken)
const jwt = require('jsonwebtoken'); const secretKey = "mySecretKey"; const token = jwt.sign({ id: 1, username: "user123" }, secretKey, { expiresIn: "1h" }); console.log(token);
✅ JWT 검증
jwt.verify(token, secretKey, (err, decoded) => { if (err) { console.log("토큰 검증 실패"); } else { console.log("디코딩된 정보:", decoded); } });
📌 이처럼 JWT는 인증 과정에서 빠르고 간편하게 활용할 수 있음!
7. 결론 🎯
✅ JWT는 세션 없이 인증할 수 있는 강력한 방법!
✅ 서버 확장성이 뛰어나고 API 인증에 적합!
✅ 하지만 보안 문제를 고려하여 올바르게 사용해야 함! 🔥👉 이제 JWT를 활용하여 안전하고 확장성 있는 인증 시스템을 구축해 보세요! 🚀
728x90'Developer' 카테고리의 다른 글
Virtual DOM이란? 🚀 리액트가 빠른 이유! (0) 2025.03.18 CSRF 공격이란? 🚨 웹 보안 위협과 방어 전략 완벽 정리! (1) 2025.03.04 CORS 없이 SOP를 우회하는 방법 🚀 안전하고 합법적인 우회 전략! (1) 2025.02.28 이미지 포맷 완벽 가이드 🚀 JPG, PNG, WebP, AVIF 차이점 한눈에 정리! (0) 2025.02.26 자바스크립트 프로토타입 상속이란? 🚀 쉽게 이해하는 객체지향의 비밀! (2) 2025.02.25