[spring(스프링)] JWT(JSON Web Token) _디버깅의 눈물
JWT(JSON Web Token)이란?
JWT(JSON Web Token)는 JSON 형식의 데이터를 사용해 안전하게 정보를 전송하고, 인증하는데 사용되는 암호화된 토큰입니다.
JWT의 구조
1. 헤더(Header)
토큰의 타입 및 암호화 알고리즘 정보를 포함합니다.
2. 내용(Payload)
전달하려는 정보가 name/value의 쌍으로 포함되어 있습니다. 클래임(claim)이라고도 부르며, 클레임에는 사용자 ID, 권한 등의 정보가 포함됩니다.
3. 서명(Signature)
토큰의 유효성 검증을 위한 서명입니다. 서명은 헤더와 페이로드, 그리고 발급 서버가 지정해준 비밀키를 조합하여 생성됩니다.
JWT의 작동 방식
HTTP 헤더에 암호화된 JSON 토큰을 실어 서버가 클라이언트를 식별하는 방식으로 작동합니다. JWT는 클라이언트에 저장되기 때문에 서버의 부하를 줄일 수 있습니다. OAuth와 함께 자주 사용됩니다.
JWT의 장단점
장점
1. Stateless(무상태성)
JWT는 서버가 상태를 유지할 필요가 없으므로, 확장성이 우수합니다.
2. 안정성
비밀키나 공개/비밀키 쌍을 이용해 디지털 서명되기 때문에, 클라이언트나 공격자에 의해 변조될 수 없습니다.
3. 호환성
JSON 형식을 사용하므로, 다양한 플랫폼에서 사용할 수 있습니다.
4. 서버의 부하를 줄임
클라이언트에 저장되므로, 서버의 부하를 줄일 수 있습니다.
단점
1. 토큰 크기
claim에 넣는 데이터가 많아질수록, 네트워크 대역폭과 저장 공간의 낭비가 심해질 수 있습니다.
2. 취약성
JWT의 암호화는 공개키/개인키를 사용하는 것이 아니기 때문에, JWT 토큰을 탈취한 공격자가 해당 토큰에 대한 제어권을 가질 수 있습니다. JWT가 탈취될 경우, 사용자의 정보가 노출될 수 있습니다. 이를 방지하기 위해 토큰을 자주 갱신하거나, 추가적인 보안 체계를 구성해야 합니다.
JWT와 OAuth의 차이?
웹 애플리케이션에서 인증 및 권한 부여를 수행하는 기술이라는 점에서 공통점이 있지만, 다음과 같은 차이점이 존재합니다.
1. 토큰 vs 프로토콜
JWT는 토큰의 종류이고, OAuth는 토큰을 발급하고 인증하는 프로토콜입니다.
2. 사용 목적
JWT는 안전한 데이터 전송과 인증을 위해 사용되지만, OAuth는 다른 서비스에 대한 접근 권한을 부여하는데 사용됩니다.
3. 발행 방식
JWT는 서버 내부에서 발행됩니다. 반면에 OAuth는 외부 서비스에서 발행된 토큰을 사용합니다.
4. 범위
JWT는 단일 도메인에서 작동되지만, OAuth는 서로 다른 도메인 간에서 작동됩니다.