JWT

JWT (JSON Web Token)

JWT(JSON Web Token)는 JSON 기반의 경량 토큰으로, 사용자 인증과 정보 교환을 안전하게 수행할 수 있도록 설계된 인증 방식입니다.

웹 애플리케이션에서 사용자가 로그인할 때, JWT를 생성하여 클라이언트(브라우저 또는 모바일 앱)와 서버 간에 인증 정보를 안전하게 주고받을 수 있습니다.
JWT는 암호화된 서명을 포함한 문자열 형식으로 되어 있으며, 토큰을 검증하면 사용자의 신원을 확인할 수 있습니다.


JWT 예시

1. JWT의 구성

JWT는 3개의 부분으로 구성됩니다.

구성 요소설명
Header (헤더)토큰 유형(JWT) 및 알고리즘 정보 포함
Payload (페이로드)사용자 정보(클레임) 및 추가 데이터 포함
Signature (서명)토큰의 무결성을 보장하는 서명

JWT 예제

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJ1c2VySWQiOiIxMjM0IiwibmFtZSI6Iu2PrOq1rCIsImV4cCI6MTY5OTkyNzAwMH0
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

1) 헤더(Header)

{
  "alg": "HS256",
  "typ": "JWT"
}
  • alg: 서명 알고리즘 (예: HMAC SHA256)
  • typ: 토큰 유형(JWT)

2) 페이로드(Payload)

{
  "userId": "1234",
  "name": "홍길동",
  "exp": 1699927000
}
  • userId: 사용자 ID
  • name: 사용자 이름
  • exp: 토큰 만료 시간(Unix Timestamp)

3) 서명(Signature)

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret-key
)
  • 서버에서 설정한 비밀키(secret-key)를 사용하여 생성됨.
  • 이 서명을 통해 토큰이 변조되지 않았음을 확인 가능.

활용 범위

1. 사용자 로그인 및 인증

  • 사용자가 로그인하면 JWT를 발급받아 이후 요청에서 토큰을 사용하여 인증.
  • 기존의 세션 기반 인증과 달리 JWT는 서버에 상태를 저장하지 않고 인증 가능(Stateless).

2. API 보안 및 접근 권한 제어

  • REST API에서 클라이언트가 요청을 보낼 때, JWT를 포함하여 인증된 요청인지 확인.
  • 예제: Authorization: Bearer <JWT> 헤더를 사용하여 API 요청.

3. 싱글 사인온(SSO, Single Sign-On)

  • JWT를 사용하면 하나의 로그인 정보로 여러 서비스에 접근 가능.
  • 예제: Google, Facebook 로그인 시 JWT를 활용하여 여러 애플리케이션에서 로그인 유지.

주의할 점

1. 토큰 탈취 및 보안 위험

  • JWT는 민감한 정보를 담지 않아야 하며, HTTPS를 사용하여 전송해야 합니다.
  • 비밀키(secret-key)가 유출되면 보안이 심각하게 위협받을 수 있음.

2. 토큰 만료(expiration) 설정

  • JWT는 기본적으로 상태를 저장하지 않으므로, 토큰이 만료되면 재발급(refresh token) 메커니즘을 적용해야 합니다.
  • 토큰 만료 시간(exp)을 적절하게 설정해야 합니다.

3. 토큰 크기 문제

  • JWT는 세션보다 상대적으로 크기가 크기 때문에, 요청 헤더 크기를 고려해야 합니다.
  • 필요 없는 정보는 포함하지 않는 것이 좋습니다.

JWT는 웹 및 모바일 애플리케이션에서 사용자 인증을 간편하고 안전하게 구현할 수 있는 방법입니다.
REST API, OAuth 인증, 싱글 사인온(SSO) 등에서 널리 사용되며, 세션 관리 없이 무상태(Stateless) 인증을 지원하기 때문에 확장성이 뛰어난 서비스에 적합합니다.