Spring Boot
💡 시작하며: HTTP 프로토콜은 Stateless(무상태) 특징을 가지고 있어, 서버는 방금 전 요청을 보낸 사람이 누구인지 기억하지 못합니다. 우리가 로그인 후 페이지를 이동해도 로그아웃되지 않는 이유는 바로 '쿠키'와 '세션' 덕분입니다.
1. 쿠키 (Cookie): 브라우저에 저장되는 작은 정보
쿠키는 서버가 클라이언트(브라우저)에게 보내는 작은 텍스트 파일입니다. 브라우저는 이 정보를 보관하고 있다가, 다음에 같은 서버에 요청을 보낼 때마다 쿠키를 함께 담아서 보냅니다.
- 저장 위치: 클라이언트(웹 브라우저)
- 동작 방식: 서버가 응답 헤더에
Set-Cookie를 담아 보내면, 브라우저가 이를 저장합니다. - 단점: 보안에 취약합니다. 클라이언트 측에서 수정이 가능하고, 네트워크를 통해 전달될 때 탈취될 위험이 있습니다.
2. 세션 (Session): 서버가 관리하는 안전한 정보
쿠키의 보안 문제를 해결하기 위해 등장한 개념입니다. 중요한 정보(사용자 ID 등)는 서버의 메모리나 DB에 저장하고, 클라이언트에게는 이 정보에 접근할 수 있는 영수증 번호(Session ID)만 건네주는 방식입니다.
세션의 동작 흐름
- 사용자가 로그인을 시도합니다.
- 서버는 사용자를 확인한 후, 고유한 Session ID를 생성하여 서버 메모리에 저장합니다.
- 서버는 응답 시 쿠키에 Session ID만 담아서 클라이언트에게 보냅니다.
- 브라우저는 이후 요청마다 이 Session ID가 담긴 쿠키를 함께 보냅니다.
- 서버는 Session ID를 보고 "아, 이 사람이 그때 그 사람이구나!"라고 판단합니다.
3. 쿠키 vs 세션 한눈에 보기
| 구분 | 쿠키 (Cookie) | 세션 (Session) |
|---|---|---|
| 저장 위치 | 클라이언트 (브라우저) | 서버 (메모리/DB) |
| 보안성 | 낮음 (데이터 노출 위험) | 높음 (ID만 전달됨) |
| 라이프 사이클 | 브라우저 종료 후에도 유지 가능 | 브라우저 종료 시 삭제됨 |
| 속도 | 빠름 (서버 조회 없음) | 쿠키보다 느림 (서버 처리 필요) |
정리
결국 세션도 그 Session ID를 전달하기 위해 쿠키를 사용한다는 것
쿠키는 장바구니나 아이디 자동 완성 같은 편의 기능에사용이되고
세션은 로그인 정보 같은 민감한 데이터 관리에 주로 사용된다.
Q1. HTTP의 Stateless(무상태) 특징에 대해 설명하고, 이를 보완하는 방법을 말씀해 주세요.
- 답변: HTTP는 서버가 클라이언트의 이전 상태를 보존하지 않는 Stateless 프로토콜입니다. 이로 인해 서버는 각 요청을 독립적으로 처리하며 사용자를 식별하지 못합니다. 이를 보완하기 위해 클라이언트 측에 데이터를 저장하는 쿠키(Cookie)와 서버 측에서 데이터를 관리하는 세션(Session) 기술을 사용하여 연결 상태를 유지합니다.
Q2. 쿠키만 사용하지 않고 세션을 함께 사용하는 이유는 무엇인가요?
- 답변: 가장 큰 이유는 보안 때문입니다. 쿠키는 로컬에 저장되므로 사용자가 임의로 수정하거나 탈취당하기 쉽습니다. 따라서 민감한 정보는 서버의 안전한 저장소인 세션에 보관하고, 클라이언트에게는 외부에 노출되어도 무방한 세션 ID만 전달함으로써 보안성을 높입니다.
Q3. 세션 방식을 사용할 때 서버에 가해지는 부담은 어떤 것이 있으며, 어떻게 해결할 수 있나요?
- 답변: 세션은 서버의 메모리나 DB에 정보를 저장하므로, 동시 접속자가 많아질수록 서버 자원(RAM 등)을 많이 소모하게 됩니다. 이를 해결하기 위해 세션 타임아웃을 적절히 설정하거나, 여러 대의 서버가 세션을 공유할 수 있도록 Redis 같은 외부 인메모리 DB를 사용하거나, 서버 부하가 적은 JWT(JSON Web Token) 방식을 고려할 수 있습니다.
'Spring > spring 숙련' 카테고리의 다른 글
| RestTemplate (0) | 2026.04.09 |
|---|---|
| Vaildation (1) | 2026.04.09 |
| Session/Cookie/Filter/Listener (0) | 2026.04.09 |
| 인증(Authentication) vs 인가(Authorization) (0) | 2026.04.09 |
| Bean 수동 등록, 중복 빈 해결하기 (1) | 2026.04.09 |
