[Backend] [JWT] JWT(JSON Web Token)란 ?

하롭·2025년 3월 16일
post-thumbnail

✏️ JWT란?

JWT는 "JSON Web Token"의 약자로, JSON 기반의 토큰(Token) 방식 인증을 의미한다. 주로 웹 및 모바일 애플리케이션의 인증(Authentication)과 정보 교환을 위해 사용됨. 기존 세션(Session)이나 쿠키(Cookie) 기반 인증보다 간편하고 확장성이 뛰어난 방식이다!

✅ JWT가 필요한 이유

  • HTTP는 상태를 저장하지 않는(stateless) 프로토콜이기 때문에 사용자의 로그인 상태를 유지하려면 추가적인 인증 방식이 필요하다.
  • 기존 세션 기반 인증은 서버가 사용자의 정보를 직접 저장해야 하므로 확장성에 한계가 있음.
  • JWT를 사용하면 서버가 상태를 유지할 필요 없이 클라이언트가 인증 정보를 직접 보관할 수 있다.

🔎 JWT의 구조

JWT는 세 부분으로 구성되며, 각각 점(.)으로 구분된다.

1️⃣ Header (헤더)

헤더는 JWT의 유형과 서명에 사용할 알고리즘을 지정함.

{
  "alg": "HS256",
  "typ": "JWT"
}
  • alg: 서명에 사용된 암호화 알고리즘 (예: HS256, RS256 등)
  • typ: 토큰 타입 (항상 "JWT"로 설정됨)

2️⃣ Payload (페이로드)

페이로드는 사용자 정보 및 토큰의 추가적인 데이터를 포함하는 부분임.

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "iat": 1516239022,
  "exp": 1516249022
}
  • sub (Subject): 사용자의 고유 ID
  • name: 사용자의 이름
  • admin: 관리자 여부
  • iat (Issued At): 토큰이 발행된 시간 (Unix Timestamp)
  • exp (Expiration): 토큰의 만료 시간

🚨 주의: 페이로드는 Base64로 인코딩되어 있지만 암호화되지 않으므로 중요한 정보를 저장하면 안됨‼️!

3️⃣ Signature (서명)

서명은 토큰이 변조되지 않았음을 검증하는 역할.

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secretKey
)

🦾 JWT의 작동 원리

1️⃣ 사용자가 로그인 요청을 보냄
👉 클라이언트(사용자)는 아이디와 비밀번호를 입력하여 서버에 로그인 요청을 함.
2️⃣ 서버가 사용자 정보를 확인
👉 서버는 요청을 받아서 DB에서 해당 사용자가 존재하는지 조회.
3️⃣ 서버가 JWT 토큰을 생성
👉사용자가 유효한 계정이라면, 서버는 Secret Key를 사용하여 JWT 토큰을 생성한다.
생성된 JWT는 사용자의 정보를 포함하며, 서버에서 관리할 필요 없이 클라이언트가 보관함.
4️⃣ 서버가 클라이언트에게 JWT 토큰 전달
👉서버는 JWT를 클라이언트(사용자)에게 반환.
이후부터 클라이언트는 이 JWT를 사용하여 API 요청을 보낼 수 있음.
5️⃣ 클라이언트가 API 요청 시 JWT를 포함하여 보냄
👉클라이언트는 API 요청을 보낼 때 JWT를 Authorization: Bearer <토큰> 헤더에 포함합니다.
JWT는 쿠키를 사용할 필요 없이 HTTP 요청 헤더를 통해 전달됨.
6️⃣ 서버가 JWT를 검증하여 사용자 인증 수행
👉서버는 JWT의 서명을 확인하여 변조되지 않았음을 검증한다.
JWT가 유효하면 사용자가 신뢰할 수 있는 사용자임을 확인하고 요청을 처리.
7️⃣ 서버가 API 응답 반환
👉검증이 완료되면, 서버는 요청에 대한 응답을 클라이언트에게 반환.

🥨 JWT 사용의 장점과 단점

장점

  • 무상태성(Stateless): 서버가 세션을 저장하지 않아 확장성이 뛰어남.
  • 빠른 인증: 서버가 세션을 조회할 필요 없이 토큰만 검증하면 됨.
  • 보안성: 서명을 통해 변조 여부를 검증할 수 있음.
  • 모바일 & API 친화적: 다양한 클라이언트(웹, 모바일, IoT)에서 쉽게 사용할 수 있음.

단점

  • 보안 위험: 토큰이 탈취되면 만료될 때까지 사용할 수 있음.
  • 페이로드 노출: Base64로 인코딩되어 있어 민감한 정보를 저장하면 안 됨.
  • 토큰 크기 문제: JWT는 쿠키나 세션보다 크기가 커질 수 있음.

⚠️ JWT 사용 시 주의점

  • 🔒 민감한 정보(비밀번호, 카드 정보 등)는 절대 페이로드에 포함하면 안 됨.
  • 🔑 비밀 키(secret key)를 안전하게 관리해야 함.
  • 🔗 HTTPS를 사용하여 토큰이 노출되지 않도록 해야 함.
  • 토큰의 유효기간(exp)을 적절히 설정하여 보안을 강화해야 함.
  • 🔄 Refresh Token을 사용하여 액세스 토큰을 갱신하는 방식을 고려해야 함.

🆚 JWT vs. OAuth 2.0 비교

기능JWTOAuth 2.0
인증 방식자체 검증토큰 발급 및 검증 서버 필요
보안 수준취약(탈취 가능)보안 강화(Access Token + Refresh Token)
사용 용도API 인증, 서버 간 통신SSO, API 접근 제어
유효 기간유효 시간 설정 필요자동 갱신 가능

📌 JWT 실제 사용 사례

  • 🔑 사용자 로그인 및 인증 (예: REST API, GraphQL 인증)
  • 🔓 싱글사인온(SSO, Single Sign-On) 시스템
  • 📡 서버 간 데이터 교환 (API Gateway, 마이크로서비스)
  • 🔒 모바일 및 IoT 장치 인증

💡 결론

JWT는 간단하고 확장성이 뛰어난 인증 방식으로, 특히 API 및 마이크로서비스 환경에서 많이 사용된다. 하지만 보안 취약점이 있을 수 있으므로, 토큰 만료 시간 설정, HTTPS 사용, Refresh Token 활용 등의 보안 조치를 병행함을 잊지 말자.

참고 및 이미지 출처: https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC#jwt_json_web_token_%EC%9D%B4%EB%9E%80
https://velog.io/@chuu1019/%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-JWTJson-Web-Token

profile
휘발 방지 로그

0개의 댓글