세션 기반 인증과 토큰 기반 인증의 차이
최종 수정 : 2025-05-27
세션 기반 인증과 토큰 기반 인증 비교
■ 서버(세션) 기반 인증
세션이란 서버 측에서 저장하는 사용자의 정보에 대한 기록이다. 메모리, 디스크, 데이터베이스 등을 통해 관리한다. 예를 들어, 로그인을 하면 세션에 사용자 정보를 저장하고 이 정보가 필요한 서버를 제공할 때 사용하는 방식이며, 이를 Statfull 서버라 한다.
서버(세션) 기반 인증은 세션(session)과 쿠키(Cookie)가 사용되며 아래와 같은 인증 절차가 진행된다.
세션 기반 인증은 세션을 활용한다. 서버에서 세션 정보를 기록한 뒤에 세션을 식별하는 id를 Set-Cookie로 클라이언트에 응답한다. 이후 클라이언트가 서버에 요청할 때 서버에서 응답한 쿠키를 자동으로 포함하게 된다. 그러면 서버는 클라이언트의 쿠키에 담긴 세션 id만 확인해서 어떤 방문자인지 파악할 수 있다.
유저가 로그인하게 되면 서버에서 세션에 유저 id를 저장하면 된다. 이후 서버는 요청을 보낸 유저를 특정할 수 있게 된다. 이러한 세션은 일정한 기간이 지나거나 클라이언트에서 로그아웃 요청을 보낼 경우, 해당 세션이나 로그인 유저를 만료 처리한다.
장점
- 서버에서 세션정보가 관리되므로 상대적으로 안전하다.
- 서버에 세션정보가 있기 때문에 상태 여부를 확인하기 수월하다.
단점
- 서버 확정에서의 어려움이 있다.
- 메모리 / 데이터베이스의 과부화로 성능에 영향을 준다.
■ 토큰 기반 인증
서버는 인증받은 사용자에게 토큰을 발급하고, 클라이언트에서는 이 토큰을 저장하여 서버로 서비스 요청 시 헤더에 토큰을 실어 보내 유효성 검사를 하는 인증 방식이다. 서버에 클라이언트 정보를 저장하지 않으므로 Stateless 서버라 한다.
인증 토큰
유저에 대한 정보를 암호화한 문자열이다. 특정 콘텐츠에 접근 할 수 있게 해주기 때문에 Access token이라고도 한다. 토큰의 형식은 JWT(JSON Web Token) 형식을 많이 사용한다.
토큰 생성 및 인증 절차는 다음과 같다.
세션 기반 인증과 달리 유저의 로그인 상태를 저장하고 요청이 올 때마다 저장 및 확인하지 않고도 요청을 보낸 유저를 식별할 수 있다. 대신 토큰 자체를 해석해서 사용한다.
- 유저가 이메일, 비밀번호를 입력해 로그인 요청을 하면 서버는 유효한지 확인한다.
- 그 다음 서버는 유저를 식별할 수 있는 id, 만료일 등의 내용을 담은 토큰을 만들어 클라이언트에게 응답한다.
- 이때, 응답으로 인증 토큰을 응답의 바디로 넘기기도 하고, Set-Cookie를 하기도 한다. 이 토큰은 담고 싶은 정보와 서버에서만 알고 있는 비밀키를 활용해 만들어진 사람이 식별할 수 없는 문자열이다.
- 이후 클라이언트는 응답으로 받은 토큰을 서버에 요청할 때 Authorization 헤더에 담아 보낸다.
- 서버는 클라이언트의 토큰을 비밀키를 사용해 다시 해석하고 유효성 검증 및 유저를 특정한다.
- 인증 토큰을 사용하면 문자열 토큰을 갖고 있기만 하고 만료시간이 지나지 않았으면 항상 로그인 상태를 유지할 수 있다. 로그아웃을 하고 싶으면 클라이언트에서 직접 저장한 토큰을 삭제해주면 된다.
장점
- 서버에 저장되지 않아 메모리 / 데이터베이스 성능에 영향이 적고 서버 확장에 용이하다.
- 토큰을 이용하여 로그인 정보가 다른 분야로 확장하여 이용할 수 있도록 하는 데 용이하다.
(ex. Google, Fackbook 등등의 계정으로 로그인 처리) - 여러 플랫폼 및 도메인에서 토큰을 이용한 검증이 가능하여, 여러 디바이스나 도메인에서 인증이 가능하다.
단점
- 토큰의 길이가 길어져 네트워크 대역폭에 대한 낭비가 존재한다.
- 토큰 발생 시 사용되는 Signature 정보만 맞으면, 맞는 토큰으로 인식하기에 한번 발급된 토큰의 정보를 바꾸는 게 불가능하다.
- 단순 Base64로만 인코딩되기 때문에 토큰이 불법적으로 취득되면 사용자 정보가 노출된 가능성이 있다.
--> 그러나, 이를 보완하는 방법으로 JWT 방식을 통해 토큰 자체를 암호화할 수 있다.
■ 비교
1. 효율성
세션 기반 인증을 하면 서버는 항상 로그인 세션 정보를 저장하며, 매 리퀘스트의 유저가 누구인지를 이 정보와 비교해야 된다. 이를 위해 용량과 시간이 소요된다. 로그인한 유저가 엄청 많거나 특정 시간에 몰리게 되면 서버의 리퀘스트 처리 속도가 느려질 수 있다.
반면 토큰 기반 인증은 토큰 자체 내용을 해석하기만 하면 되므로 더 효율적으로 작동할 수 있다.
2. 유연성
토큰 기반 인증은 세션 기반 인증보다 조금 더 유연하게 사용될 수 있다. 토큰을 발행하는 방법이 똑같고, 시크릿 키만 있으면, 발행한 곳과 확인하는 곳이 달라도 된다는 의미이다.
3. RESTful API
세션 정보와 같이 서버가 '상태'정보를, 예를 들어 유저의 로그인 여부를 저장하고 있을 때, stateful 하다고 표현한다. REST에 부합하기 위해서는 서버가 상태 정보를 저장하지 않는, stateless 한 특정이어야 한다. 서버는 클라이언트에서 보내는 정보만으로 충분히 상태를 파악할 수 있어야 한다.
이 기준에서 살펴보면 RESTful한 API 서버를 만들고 있다면 세션 기반 인증보다 토큰 기반 인증이 더 어울린다.
4. 무효화
세션 기반 인증은 서버에서 세션 데이터를 따로 관리하기 때문에 특정 세션을 손쉽게 무효화할 수 있다는 장점이 있다. 하지만 토큰 기반 인증에서는 따로 서버가 상태 정보를 저장하지 않기 때문에 특정 토큰을 무효화하는 게 복잡하다. 예를 들어 금융 서비스에서 누군가 유저 세션을 가로챘는데 이걸 바로 무효화할 수 없다면 저금한 돈을 뺏기는 문제가 생길 수도 있다. 물론 이중 비밀번호나, OTP를 통해 방지하는 방법들이 있지만, 세션 기반 인증을 사용하면 한 가지 안전장치를 더 쉽게 사용할 수 있다.
참고 자료
https://m.blog.naver.com/kevinjjun/222505335357
서버(세션) 기반 인증 vs 토큰 기반 인증
1. 서버(세션) 기반 인증 · 서버 측에서 사용자, 즉 클라이언트의 정보를 세션에 저장하여 기억하는 방식으...
blog.naver.com