1️⃣ 쿠키란?
쿠키는 클라이언트(브라우저) 측에 저장되는 작은 데이터 조각
HTTP는 기본적으로 Stateless(무상태) 이기 때문에, 사용자의 로그인 정보나 장바구니 상태 등을 유지하기 위해 쿠키를 사용
쿠키는 서버가 클라이언트에 저장을 요청하고, 클라이언트는 이후 모든 요청에 해당 쿠키를 자동으로 포함시켜 보냄
2️⃣ 쿠키의 저장 위치
- 브라우저 로컬 저장소에 저장
- 각 도메인별로 저장됩
- 브라우저마다 별도로 관리됨 (Chrome, Firefox, Edge 등)
- 저장 위치 확인 (예: Chrome DevTools)
- Application 탭 → Cookies → 해당 도메인 선택
3️⃣ 쿠키의 구조
| 필드 | 설명 |
| Name | 쿠키의 이름 |
| Value | 쿠키의 값 |
| Domain | 쿠키를 전송할 도메인 |
| Path | 쿠키가 전송될 경로 |
| Expires/Max-Age | 쿠키의 만료 시점 (지정하지 않으면 세션 쿠키) |
| Secure | HTTPS 연결에서만 전송됨 |
| HttpOnly | JavaScript 접근 불가능 (XSS 방어) |
| SameSite | CSRF 방어 (Lax, Strict, None) |
4️⃣ 쿠키 흐름
🔄 서버 → 클라이언트 (Set-Cookie)
Set-Cookie: token=abc123; Path=/; HttpOnly; Secure; SameSite=Lax
🔄 클라이언트 → 서버 (Request 시 자동 포함)
Cookie: token=abc123
5️⃣ 쿠키 vs 세션 vs 토큰 (간단 비교)
| 항목 | 쿠키 | 세션 | 토큰 (JWT 등) |
| 저장 위치 | 클라이언트 | 서버 | 클라이언트 |
| 인증 방식 | 상태 기반 | 상태 기반 | 무상태(Stateless) |
| 확장성 | 낮음 | 낮음 | 높음 |
| 보안 | HttpOnly/Secure로 보완 | 서버 보안 필요 | 토큰 자체에 서명 |
6️⃣ 쿠키 관련 보안 이슈
- XSS (Cross-Site Scripting)
→ HttpOnly 설정으로 방지 - CSRF (Cross-Site Request Forgery)
→ SameSite 설정으로 방지 (Lax, Strict) - 탈취 위험
→ HTTPS + Secure + 짧은 유효기간 설정 권장
7️⃣ 실전 예시 (Spring Boot)
// 쿠키 생성
ResponseCookie cookie = ResponseCookie.from("token", "abc123")
.httpOnly(true)
.secure(true)
.path("/")
.maxAge(Duration.ofDays(1))
.sameSite("Lax")
.build();
response.setHeader("Set-Cookie", cookie.toString());
8️⃣ 쿠키를 사용하면 좋은 때
- 간단한 사용자 식별 (ex. 로그인 유지)
- 테마 설정, 언어 설정
- 자동 로그인 기능
- 로그인 시 발급한 세션 ID 혹은 토큰 저장 용도
9️⃣ 쿠키 삭제 방법
Set-Cookie: token=; Max-Age=0; Path=/;
브라우저가 해당 쿠키를 즉시 삭제합니다.
📌 정리
| 항목 | 핵심 요약 |
| 쿠키란? | 클라이언트에 저장되는 작은 데이터 |
| 저장 위치 | 브라우저(도메인별로 분리) |
| 사용 목적 | 로그인 유지, 사용자 상태 추적 |
| 보안 설정 | HttpOnly, Secure, SameSite |
| 주의사항 | XSS, CSRF 방지 설정 필수 |
'SPRING' 카테고리의 다른 글
| [SPRING] 파티셔닝(Partitioning) (1) | 2025.05.02 |
|---|---|
| [SPRING] JPA로 테이블 객체 다루기 (2) | 2025.04.30 |
| [SPRING] SSE(Sever-sent-event) (1) | 2025.04.25 |
| [SPRING] JPA Proxy (3) | 2025.04.21 |
| [SPRING] 조인(JOINED) 전략 (2) | 2025.04.19 |