세션 기반 인증 (Session-based Authentication)
한 마디 정리 : "서버가 기억하는 방식" (Stateful)
전통적으로 많이 사용해 온 방식으로, 사용자의 로그인 상태 정보를 서버의 메모리나 데이터베이스에 저장한다.
동작 과정
- 로그인: 유저가 아이디/비번을 보낸다.
- 세션 생성: 서버는 유저 정보가 맞으면 '세션 ID'라는 고유한 번호표를 생성하고, 서버 메모리(또는 DB/Redis)에 유저 정보와 함께 저장한다.
- 응답: 서버는 이 '세션 ID'를 브라우저에게 준다. (주로 쿠키에 담아서 보낸다.)
- 요청: 유저는 다음 페이지로 갈 때마다 쿠키(세션 ID)를 같이 들고 간다.
- 검증: 서버는 들어온 세션 ID가 자기 서랍(메모리)에 있는 번호인지 확인하고 서비스를 제공한다.
장점
- 보안성: 중요한 정보는 다 서버에 있고, 유저는 의미 없는 '세션 ID'만 들고 다니므로 비교적 안전한다.
- 제어 가능: 유저를 강제 로그아웃 시키거나(세션 삭제), 동시 접속자 수를 제한하는 등 서버 쪽에서 제어하기 쉽다.
단점
- 서버 부하: 접속자가 많아지면 서버 메모리가 터져나간다.
- 확장성(Scale-out) 문제: 서버를 여러 대(A, B, C)로 늘리면, A서버에서 로그인한 유저가 B서버로 요청을 보내면 B는 "넌 누구냐?" 하게 된다. (이를 해결하려면 Redis 같은 별도 세션 저장소가 필요함)
2. 토큰 기반 인증 (Token-based Authentication, 주로 JWT)
한 마디 : "사용자가 들고 다니는 방식" (Stateless)
요즘 모바일 앱이나 마이크로서비스(MSA) 환경에서 대세인 방식이다.
인증 정보를 암호화된 토큰(긴 문자열) 형태로 만들어서 사용자에게 줍니다. 서버는 따로 저장하지 않는다.
동작 과정
- 로그인: 유저가 아이디/비번을 보낸다.
- 토큰 발급: 서버는 유저 정보(ID, 권한 등)를 암호화하고 서명(Signature)을 해서 '토큰(Access Token)'을 만든다. (서버에 저장 X)
- 응답: 이 토큰을 유저에게 준다.
- 요청: 유저는 요청을 보낼 때마다 HTTP 헤더(Authorization Header)에 이 토큰을 넣어서 보낸다.
- 검증: 서버는 토큰을 받아서 "이거 내가 발급한 거 맞아?"(위변조 검사)만 확인하고 통과시킨다.
장점
- 확장성(Scalability): 서버가 유저 상태를 저장하지 않으므로(Stateless), 서버를 수십 대로 늘려도 아무 문제없다. (가장 큰 장점)
- 플랫폼 독립성: 웹 브라우저뿐만 아니라 모바일 앱(Android/iOS)에서도 사용하기 편리하다.
단점
- 토큰 탈취 위험: 토큰 자체에 정보가 들어있고 한번 발급되면 제어가 힘든다. 해커가 토큰을 훔쳐 가면 유효기간이 끝날 때까지 막을 방법이 마땅치 않다. (그래서 유효기간을 짧게 잡는다.)
- 데이터 크기: 세션 ID보다 토큰 길이가 훨씬 길어서 네트워크 트래픽이 약간 늘어난다.
한눈에 비교하기
| 구분 | 세션 (Session) | 토큰 (Token / JWT) |
| 저장 위치 | 서버 (메모리, DB) | 클라이언트 (로컬 스토리지, 쿠기 등) |
| 인증 수단 | 세션 ID (의미 없는 문자열) | 토큰 (정보를 담은 암호화 문자열) |
| 서버 부담 | 큼 (사용자 수만큼 메모리 필요) | 적음 (검증만 하면 됨) |
| 확장성 | 나쁨 (별도 조치 필요) | 좋음 (서버 늘리기 쉬움) |
| 강제 로그아웃 | 가능 (서버에서 지우면 됨) | 불가능 (만료될 때까지 기다려야 함) |
| 주 사용처 | 전통적인 웹 사이트, 관공서, 은행 | 앱, SPA, 마이크로서비스 |
면접 답변식 요약
가장 큰 차이점은 사용자의 상태 정보를 어디에 저장하느냐입니다.
세션 방식은 서버의 메모리나 DB에 사용자 정보를 저장하는 Stateful(상태 유지) 방식입니다. 보안성이 높고 관리하기 쉽지만, 사용자가 늘어나면 서버 메모리에 부하가 갈 수 있습니다.
반면, 토큰 방식(JWT 등)은 사용자 정보를 암호화된 토큰에 담아 클라이언트가 관리하게 하는 Stateless(무상태) 방식입니다. 서버는 토큰의 위변조 여부만 검증하면 되므로 서버 확장성(Scale-out)이 뛰어나다는 장점이 있습니다.
'Daily Dev Q&A 정리 템플릿' 카테고리의 다른 글
| 26.01.05 JPA를 사용하는 이유 (0) | 2026.01.05 |
|---|---|
| 26.01.02 restfull 설계방식에 대해서 설명하고 이를 적용할 때 에매한 경우의 예시를 들어, 보통 이럴 때 어떻게 하는지를 설명해주세요. (0) | 2026.01.02 |
| 25.12.31 Spring Security의 인증과 인가에 대해. (0) | 2025.12.31 |
| 25.12.30 @SpringBootApplication 어노테이션이 꼭 필요한가요? (0) | 2025.12.30 |
| 25.12.29 spring의 예외처리방식 (0) | 2025.12.29 |