[Spring] Cookie (2)

이연우·2025년 7월 28일

TIL

목록 보기
56/100

🔐 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: 쿠키 값은 수정 가능함

  • 개발자 도구(F12)에서 직접 값 변경 가능
    → 예: userId=2로 바꾸면 다른 사람으로 로그인한 것처럼 됨
Application → Cookies → userId 값 수정 가능

❗ 문제점 2: 쿠키 탈취(가로채기)

  • userId=1234 와 같은 중요한 값이 노출되면 해커가 그대로 사용할 수 있음
  • HTTP로 통신할 경우 쉽게 탈취됨 → 반드시 HTTPS 사용해야 함
  • 민감 정보(주민번호, 비밀번호) 절대 저장 ❌

🔐 보안 대처 방법

대처 방법설명
🚫 민감한 정보를 직접 저장하지 않기userId, 주민번호 등 X
🔐 토큰 사용식별 불가능한 랜덤 값 (ex. JWT, 세션ID 등)
🔒 암호화토큰은 서버에서 생성하고 검증. 클라이언트는 해독 불가
⏳ 만료 시간 설정토큰에 유효 기간 지정 (ex. 15분)
🚫 강제 만료 기능의심되는 토큰은 서버에서 무효화 처리
🧠 IP나 기기 정보 기반 제어접속 위치/환경이 다르면 로그인 차단 or 재인증 유도

🧠 요약 정리

항목요약
✅ 쿠키 용도로그인 상태 유지, 사용자 상태 기억
🛠️ 세션 vs 영속 쿠키maxAge 설정 여부에 따라 결정
🧨 보안 문제쿠키 값 수정 가능, 탈취 위험
🔐 해결 방법토큰 기반 인증, 암호화, 만료 관리, HTTPS 사용 등

0개의 댓글