🙏내용에 대한 피드백은 언제나 환영입니다!!🙏
세션과 JWT(JSON Web Token)에 대하여 알아보려고 한다.
세션 기반 인증에서는 사용자가 로그인할 때 서버가 세션 ID를 생성하고 이를 쿠키에 저장하여 클라이언트에 전달한다. 사용자가 서버에 요청을 보낼 때마다 이 쿠키가 함께 전송되어, 서버는 쿠키에 저장된 세션 ID를 통해 사용자를 식별한다. 사용자의 인증 정보와 상태는 서버의 세션저장소에 저장된다.
JWT 기반 인증에서는 사용자가 로그인할 때 사용자의 인증 정보를 담은 JWT를 생성하여 클라이언트에 전달한다. 이 토큰은 사용자가 서버에 요청할 때마다 Authorization 헤더에 포함되어 전송된다. 서버는 JWT를 검증하여 사용자를 인증한다. JWT는 만료 시간, 발급자, 주제 등의 정보를 포함할 수 있다.
JWT는 헤더(Header), 페이로드(Payload), 서명(Signature)으로 나뉜다.
헤더(Header): 토큰의 타입(JWT)과 서명을 해싱하기 위해 사용된 알고리즘(예: HMAC SHA256, RSA)이 포함된다.
페이로드(Payload): 토큰에 담을 실제 데이터가 들어 있다. 여기에는 사용자의 인증 정보, 토큰의 발행자, 만료 시간 등이 포함될 수 있다. 이 정보는 클레임(Claim)이라고 하며, 몇 가지 표준 클레임들이 있지만 사용자 정의 클레임도 사용할 수 있다.
서명(Signature): 헤더의 인코딩 값과 페이로드의 인코딩 값을 합친 후, 제공된 비밀키나 공개키/개인키 쌍을 사용하여 생성된다. 이 서명은 토큰이 중간에 조작되지 않았음을 검증하는 데 사용된다.
<출처 - VELOPERT.LOG>
<jwt.io에 들어가 JWT 토큰으로 변환해 볼 수 있다.>
세션과 JWT는 사용자의 상태를 유지하는 방법과 확장성, 보안성 등에서 차이를 보인다.
세션 - 서버에 사용자의 상태 정보를 저장한다.
JWT - 사용자가 접속을 요청할 때마다 헤더에 인증 토큰을 담아서 보내어 권한을 인증한다.
세션 - 상태 유지 방법에서 볼 수 있듯, 서버에 사용자의 상태 정보를 저장한다. 그로 인해, 로드 밸런싱의 어려움이 있기에 대규모 분산 시스템에서는 어려움을 보인다.
JWT - 인증 정보가 클라이언트에 저장되므로, 대규모 분산 시스템에서의 인증이 용이하다. 또한, 세션과 달리 서버에서 정보를 관리하지 않아 서버 부하가 감소된다.
세션 - 서버와 클라이언트는 세션ID만 주고받으므로, 정보의 노출이 적다.
JWT - Payload에 사용자의 정보가 들어가는 경우가 많다. 그래서, 중요한 정보는 넣지 않는게 좋다.
하지만, 세션과 JWT 둘 다 탈취당한다면, 개인 정보의 노출이 있다. 그에 적절한 보안 처리를 해놓아야 한다.
위의 특징을 보아 나의 생각을 정리해보자면, 소규모 사이트에서는 세션을 사용해도 좋을 것 같다. 세션ID를 통해 서버에 저장된 사용자의 상태 정보를 보고 인증이 가능하므로 복잡하지 않기 때문이다.
하지만, 트래픽이 많이 발생하는 대규모 사이트인 경우, 서버를 여러 대 사용하기에 서버에 정보를 저장하는 세션을 사용하기에는 어려움을 보인다.(아래에 그 이유를 적곘다.) 그래서, JWT를 사용하여 인증을 할 때 클라이언트가 헤더에 인증 토큰을 담아서 보내는 방식이 적절하다고 생각한다.
상황과 규모 등에 따라 팀원들간의 의견을 공유해 세션과 JWT를 적절히 선택해야 한다.
대규모 분산 시스템에서 '세션 인증 방식'이 적잘하지 않은 이유
1. 로드밸런싱을 사용한다면, 사용자가 정보가 저장된 서버로 세션을 보내준다. 하지만, 서버에 많은 정보가 저장될 경우, 트래픽을 분배해주는 로드밸런싱의 이점을 잃게 된다.
2. 사용자의 정보가 저장되어 있는 서버가 다운되면 자신의 세션 정보를 잃게된다.
보안은 아주 중요하다. 보안이 허술하다면, 사용자는 사이트 사용에 있어서 안심하지 못하고, 결국에는 신뢰성을 잃게되어 사용자가 떠날 것이다.
세션 방식을 사용하든 JWT 방식을 사용하든 그에 맞게 보안 상태를 갖추어야 한다.
다음은, JWT에 대해서 더 자세히 알아보고자 한다.