본문 바로가기

네트워크

[네트워크] JWT(Json Web Token)

728x90

JWT (JSON Web Token)란?

JWT는 JSON Web Token의 약자로, JSON 형식의 데이터를 사용해 자가 포함(Self-contained) 방식으로 정보를 안전하게 전달하는 토큰 기반 인증 방식입니다. JWT는 URL, HTTP 헤더, HTML Form 등 다양한 방식으로 전송할 수 있으며, 서버와 클라이언트 간의 인증 정보를 담아 통신합니다.

 

 

JWT의 구성

JWT는 Header, Payload, Signature세 가지 부분으로 구성되며, 각 부분은 Base64 URL 인코딩되어 마침표(.)로 구분됩니다. 예를 들어, 다음과 같은 형태를 가집니다:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 // HEADER
.eyJ1c2VySWQiOjEyMywiZXhwIjoxNjI3MjA0MDgwfQ // PAYLOAD
.i_ZKpoP7DC02DEso-LcjjhrUmFgeZyQBSiZn6gZWbbY // SIGNATURE

 

1. Header

  • JWT의 타입(JWT)과 암호화 알고리즘(예: HS256)을 포함합니다.
  • JSON 객체로 작성되며 Base64로 인코딩됩니다.
{
  "alg": "HS256",
  "typ": "JWT"
}

 

2. Payload

  • 클레임(Claim) 정보를 담는 부분입니다. 클레임은 사용자의 ID, 권한, 만료 시간 등과 같은 데이터를 포함합니다.
  • Base64로 인코딩되며, 누구나 디코딩할 수 있기 때문에 민감한 정보는 포함하면 안 됩니다.
{
  "userId": 123,
  "role": "admin",
  "exp": 1627204080
}

 

3. Signature

  • Header + Payload를 조합한 후, 서버의 비밀 키(Secret Key)를 사용해 서명한 값입니다.
  • 서명(Signature)은 토큰의 무결성을 보장하며, JWT가 조작되지 않았음을 검증합니다.

 

JWT 사용 이유

1. 클라이언트 식별

  • HTTP 프로토콜무상태(Stateless) 프로토콜이기 때문에 클라이언트의 상태를 저장하지 않습니다. 따라서 클라이언트를 식별하기 위해 토큰이 필요합니다. JWT는 클라이언트의 상태를 서버에 저장할 필요 없이, 각 요청에 토큰을 포함해 클라이언트를 식별합니다.

2. 세션의 문제점 해결

  • 세션 기반 인증에서는 사용자의 세션 정보를 서버가 관리해야 하므로, 많은 사용자가 접속할 경우 서버에 부하가 발생합니다.
  • 또한 세션 만료 시 자주 로그인을 해야 하는 불편함이 있습니다.
  • 반면, JWT는 서버가 상태를 저장하지 않고도 토큰에 포함된 정보로 클라이언트를 식별할 수 있습니다.

3. 무결성 보장

  • JWT는 조작이 불가능합니다. Header, Payload, Secret Key를 사용해 생성한 Signature 덕분에, JWT의 일부라도 수정되면 유효하지 않은 토큰으로 인식됩니다.

 

JWT의 단점

토큰의 크기

  • JWT는 Header + Payload + Signature로 구성되며, Base64 인코딩 때문에 토큰 크기가 커집니다.
  • 이로 인해 요청의 전송 속도가 느려질 수 있습니다.
  • 모바일 환경에서는 불필요한 데이터 전송이 문제가 될 수 있습니다.

탈취 시 위험성

  • JWT는 서버가 상태를 저장하지 않기 때문에 토큰이 유출될 경우 심각한 보안 문제가 발생할 수 있습니다.
  • 만약 공격자가 유효한 JWT를 탈취하면, 만료되기 전까지 유효한 권한을 사용할 수 있습니다.
  • 이 문제를 해결하기 위해 HTTPS를 사용하고, 짧은 만료 시간재발급(Refresh Token) 전략을 병행해야 합니다.

토큰 취소 불가능

  • JWT는 서버에 저장된 세션 정보가 없기 때문에, 토큰을 강제로 무효화하기 어렵습니다.
  • 만료 시간이 남아 있는 JWT는 유효한 상태로 남아있기 때문에, 사용자가 로그아웃하더라도 해당 토큰을 사용할 수 있는 문제점이 있습니다.
  • 이 문제를 해결하려면 블랙리스트를 사용하거나 짧은 만료 시간을 설정해야 합니다.

Payload 보안 취약성

  • JWT의 Payload는 인코딩(Base64)된 상태일 뿐 암호화된 정보가 아닙니다. 따라서 누구나 디코딩해서 내용을 확인할 수 있습니다.
  • 민감한 정보는 Payload에 포함하면 안 되며, 필요한 최소한의 정보만 담는 것이 좋습니다.

 

 

정리

JWT경량화된 토큰 기반 인증 방식으로, 서버와 클라이언트 간에 인증 정보를 안전하게 전달하기 위해 사용됩니다. JWT는 서버에 세션을 저장할 필요가 없고, 무결성을 보장하지만, 유출 시 보안 문제가 발생할 수 있으므로 짧은 만료 시간재발급 토큰을 사용해 관리해야 합니다.

장점:

  • 서버의 상태를 유지할 필요가 없음 (Stateless)
  • 무결성 보장 (토큰 조작 불가)
  • 다양한 클라이언트에서 사용 가능 (웹, 모바일 등)

단점:

  • 토큰 크기가 커질 수 있음
  • 토큰 탈취 시 보안 문제 발생
  • 로그아웃 후에도 토큰이 유효함
  • Payload에 민감한 정보 포함 불가

JWT는 세션 기반 인증의 대안으로 널리 사용되며, 효율적인 인증과 보안을 위해 HTTPS 사용토큰 관리 전략을 병행하는 것이 중요합니다.

728x90