🔐 Cookie로 로그인 상태 유지하기
- 로그인, 장바구니, 마지막 접속 시간, 광고 추적 등
사용자의 상태를 기억하기 위해 Cookie 사용
📌 Cookie 사용 방법

사용자가 로그인에 성공하면 →
✅ 서버가 Set-Cookie: userId=1로 응답 헤더에 쿠키 설정
브라우저는 쿠키를 저장하고
📤 이후 서버 요청마다 자동으로 쿠키를 포함시켜 전송함
서버는 쿠키 값을 기반으로
👤 어떤 사용자인지 식별하여 로그인 상태 유지
💻 코드 흐름 요약
▶️ 사용자 로그인 시
UserController가 로그인 처리userId 값을 쿠키로 설정Cookie cookie = new Cookie("userId", String.valueOf(userId));
response.addCookie(cookie);
maxAge를 설정하지 않으면 세션 쿠키🏠 로그인된 사용자만 home 진입 가능
@GetMapping("/home")
public String home(@CookieValue(name = "userId", required = false) Long userId) {
if (userId == null) return "login";
UserResponseDto user = userService.findById(userId);
if (user == null) return "login";
model.addAttribute("loginUser", user);
return "home";
}
userId가 없거나 DB에 없는 유저라면 → login 페이지 이동userId가 있으면 → home 페이지에서 로그인 사용자 이름 표시🚪 로그아웃 시
Cookie cookie = new Cookie("userId", null);
cookie.setMaxAge(0); // 0초로 설정해 쿠키 삭제
response.addCookie(cookie);
🔍 브라우저에서 테스트
1. 비로그인 상태로 /home 접근 시 → login.html 페이지
2. 로그인 성공 시 →
userId=1)home.html에서 사용자 이름 출력3. 로그아웃 시 →
⚠️ Cookie 문제점
- 쿠키는 보안에 취약하여
userId=1형태의 방식으로 로그인을 구현하지 않음
→ 쿠키에 중요한 값을 직접 담으면 보안상 큰 문제가 발생할 수 있음
❗ 문제점 1: 쿠키 값은 수정 가능함
userId=2로 바꾸면 다른 사람으로 로그인한 것처럼 됨Application → Cookies → userId 값 수정 가능
❗ 문제점 2: 쿠키 탈취(가로채기)
userId=1234 와 같은 중요한 값이 노출되면 해커가 그대로 사용할 수 있음주민번호, 비밀번호) 절대 저장 ❌🔐 보안 대처 방법
| 대처 방법 | 설명 |
|---|---|
| 🚫 민감한 정보를 직접 저장하지 않기 | userId, 주민번호 등 X |
| 🔐 토큰 사용 | 식별 불가능한 랜덤 값 (ex. JWT, 세션ID 등) |
| 🔒 암호화 | 토큰은 서버에서 생성하고 검증. 클라이언트는 해독 불가 |
| ⏳ 만료 시간 설정 | 토큰에 유효 기간 지정 (ex. 15분) |
| 🚫 강제 만료 기능 | 의심되는 토큰은 서버에서 무효화 처리 |
| 🧠 IP나 기기 정보 기반 제어 | 접속 위치/환경이 다르면 로그인 차단 or 재인증 유도 |
🧠 요약 정리
| 항목 | 요약 |
|---|---|
| ✅ 쿠키 용도 | 로그인 상태 유지, 사용자 상태 기억 |
| 🛠️ 세션 vs 영속 쿠키 | maxAge 설정 여부에 따라 결정 |
| 🧨 보안 문제 | 쿠키 값 수정 가능, 탈취 위험 |
| 🔐 해결 방법 | 토큰 기반 인증, 암호화, 만료 관리, HTTPS 사용 등 |