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
'네트워크' 카테고리의 다른 글
[네트워크] 네트워크의 성능 (6) | 2024.11.09 |
---|---|
[네트워크] 쿠키와 세션 (0) | 2024.11.08 |
[네트워크] 동기, 비동기, Blooking, Non-Blooking (0) | 2024.10.20 |
[네트워크] HTTP 쿠키 cookie (0) | 2024.10.20 |
[네트워크] HTTP Session (4) | 2024.10.19 |