저는 그동안 팀 프로젝트에서 JWT 기반으로 사용자 정보의 인증과 권한 부여 시스템을 구축하였습니다.
오늘은 JWT의 특징과 다른 인증 방식(쿠키, 세션)과의 차이점을 통해 왜 JWT를 사용했는지 설명하겠습니다.
이 포스팅에서는 각각의 인증 방식에 대한 주요 특징만 다룰 예정입니다. 쿠키, 세션, JWT 인증 방식에 대한 자세한 개념은 이 링크를 참고해주세요.
웹 표준(RFC 7519)으로, 인증에 필요한 정보들을 JSON 포맷으로 암호화(base64UrlEncode)시킨 토큰을 의미합니다.
토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자 서명도 들어 있어 정보의 무결성과 인증이 보장됩니다.
JWT는 다음과 같이 Header
, Payload
, Signature
세 부분으로 구성됩니다.
Header(헤더): JWT에서 사용할 타입과 해시 알고리즘의 종류
Payload(페이로드): 사용자의 권한 정보와 사용자 데이터인 클레임(Claim) 정보
- 클레임(Claim)은
Json(key-value)
형태로 다수의 정보를 넣을 수 있습니다.
Signature(서명): 헤더와 페이로드의 인코딩 값을 합친 후, 헤더에 명시된 알고리즘을 사용하여 암호화한 코드
- 서명값은 서버 측에서 관리하고 있는
개인키(Private Key)
를 통해 암호화 되어있는 상태입니다.- 따라서 서명값은 개인키가 유출되지 않는 이상 복호화가 불가능합니다. 이는 토큰의 위변조 여부를 확인하는데 사용됩니다.
JWT와 쿠키 및 세션 기반 인증 방식의 차이점을 더 깊이 있게 이해하기 위해선, 각 방식의 핵심적인 특징과 운용 방식의 차이를 살펴보아야 합니다.
여기서는 JWT 특징을 중심으로 쿠키 및 세션과의 비교를 통해 각 방식의 장단점을 설명하겠습니다.
stateful
)해야 합니다.XSS(Cross-site scripting)
공격에 취약할 수 있으며, 클라이언트 측에서 쿠키를 조작할 가능성이 있어 보안상의 문제가 발생할 수 있습니다.stateful
) 방식이며, 세션 정보가 서버에 집중되어 있어 사용자가 많아질수록 서버의 부담이 증가합니다.Signature
을 검증하여 사용자를 인증합니다.쿠키와 세션에 비해 장점이 크지만, 단점도 존재합니다.
쿠키와 세션 방식은 클라이언트와 서버 간의 상태 정보를 유지하며(stateful) 인증을 처리합니다.
쿠키는 클라이언트 측에(브라우저), 세션은 서버 측에 각각 데이터를 저장하며 서버의 자원을 사용하게 되어 서비스 규모가 커질 수록 관리가 복잡해질 수 있습니다.
반면, JWT는 필요한 모든 정보(사용자 식별 정보, 권한 등)를 암호화하여 토큰 자체에 포함시키므로, 서버에서 별도의 세션 상태를 저장할 필요 없이 Stateless한 통신을 가능하게 합니다.
이는 서버로부터 들어오는 요청마다 토큰을 검증하기만 하면 되므로 서버의 부하를 줄이고 확장성을 높일 수 있습니다.
이처럼 JWT는 쿠키와 세션에 비해 강력한 장점이 존재하므로, JWT를 사용하여 사용자 인증 정보를 효율적으로 관리할 수 있습니다.