본문 바로가기
Daily Dev Q&A 정리 템플릿

26.01.01 session로그인방식과 token로그인 방식

by teg0 2026. 1. 1.

세션 기반 인증 (Session-based Authentication)

한 마디 정리 : "서버가 기억하는 방식" (Stateful)

전통적으로 많이 사용해 온 방식으로, 사용자의 로그인 상태 정보를 서버의 메모리나 데이터베이스에 저장한다.

 

동작 과정

  1. 로그인: 유저가 아이디/비번을 보낸다.
  2. 세션 생성: 서버는 유저 정보가 맞으면 '세션 ID'라는 고유한 번호표를 생성하고, 서버 메모리(또는 DB/Redis)에 유저 정보와 함께 저장한다.
  3. 응답: 서버는 이 '세션 ID'를 브라우저에게 준다. (주로 쿠키에 담아서 보낸다.)
  4. 요청: 유저는 다음 페이지로 갈 때마다 쿠키(세션 ID)를 같이 들고 간다.
  5. 검증: 서버는 들어온 세션 ID가 자기 서랍(메모리)에 있는 번호인지 확인하고 서비스를 제공한다.

 

장점

  • 보안성: 중요한 정보는 다 서버에 있고, 유저는 의미 없는 '세션 ID'만 들고 다니므로 비교적 안전한다.
  • 제어 가능: 유저를 강제 로그아웃 시키거나(세션 삭제), 동시 접속자 수를 제한하는 등 서버 쪽에서 제어하기 쉽다.

 

단점

  • 서버 부하: 접속자가 많아지면 서버 메모리가 터져나간다.
  • 확장성(Scale-out) 문제: 서버를 여러 대(A, B, C)로 늘리면, A서버에서 로그인한 유저가 B서버로 요청을 보내면 B는 "넌 누구냐?" 하게 된다. (이를 해결하려면 Redis 같은 별도 세션 저장소가 필요함)

 

2. 토큰 기반 인증 (Token-based Authentication, 주로 JWT)

한 마디 : "사용자가 들고 다니는 방식" (Stateless)

요즘 모바일 앱이나 마이크로서비스(MSA) 환경에서 대세인 방식이다.

인증 정보를 암호화된 토큰(긴 문자열) 형태로 만들어서 사용자에게 줍니다. 서버는 따로 저장하지 않는다.

 

동작 과정

  1. 로그인: 유저가 아이디/비번을 보낸다.
  2. 토큰 발급: 서버는 유저 정보(ID, 권한 등)를 암호화하고 서명(Signature)을 해서 '토큰(Access Token)'을 만든다. (서버에 저장 X)
  3. 응답: 이 토큰을 유저에게 준다.
  4. 요청: 유저는 요청을 보낼 때마다 HTTP 헤더(Authorization Header)에 이 토큰을 넣어서 보낸다.
  5. 검증: 서버는 토큰을 받아서 "이거 내가 발급한 거 맞아?"(위변조 검사)만 확인하고 통과시킨다.

 

장점

  • 확장성(Scalability): 서버가 유저 상태를 저장하지 않으므로(Stateless), 서버를 수십 대로 늘려도 아무 문제없다. (가장 큰 장점)
  • 플랫폼 독립성: 웹 브라우저뿐만 아니라 모바일 앱(Android/iOS)에서도 사용하기 편리하다.

 

단점

  • 토큰 탈취 위험: 토큰 자체에 정보가 들어있고 한번 발급되면 제어가 힘든다. 해커가 토큰을 훔쳐 가면 유효기간이 끝날 때까지 막을 방법이 마땅치 않다. (그래서 유효기간을 짧게 잡는다.)
  • 데이터 크기: 세션 ID보다 토큰 길이가 훨씬 길어서 네트워크 트래픽이 약간 늘어난다.

 

한눈에 비교하기

구분 세션 (Session) 토큰 (Token / JWT)
저장 위치 서버 (메모리, DB) 클라이언트 (로컬 스토리지, 쿠기 등)
인증 수단  세션 ID (의미 없는 문자열) 토큰 (정보를 담은 암호화 문자열)
서버 부담 큼 (사용자 수만큼 메모리 필요) 적음 (검증만 하면 됨)
확장성 나쁨 (별도 조치 필요) 좋음 (서버 늘리기 쉬움)
강제 로그아웃 가능 (서버에서 지우면 됨) 불가능 (만료될 때까지 기다려야 함)
주 사용처 전통적인 웹 사이트, 관공서, 은행 앱, SPA, 마이크로서비스

 

면접 답변식 요약

가장 큰 차이점은 사용자의 상태 정보를 어디에 저장하느냐입니다.

세션 방식은 서버의 메모리나 DB에 사용자 정보를 저장하는 Stateful(상태 유지) 방식입니다. 보안성이 높고 관리하기 쉽지만, 사용자가 늘어나면 서버 메모리에 부하가 갈 수 있습니다.

반면, 토큰 방식(JWT 등)은 사용자 정보를 암호화된 토큰에 담아 클라이언트가 관리하게 하는 Stateless(무상태) 방식입니다. 서버는 토큰의 위변조 여부만 검증하면 되므로 서버 확장성(Scale-out)이 뛰어나다는 장점이 있습니다.