Backend/spring

[JAVA] 쿠키(Cookie) 설정 방법

dddzr 2025. 2. 23. 19:43

 

쿠키 설정 방법에 대해 알아보기전에 쿠키에 대해 간단히 알아보자!!

🔍 쿠키(Cookie)란? 

쿠키는 웹 브라우저에 저장되는 작은 데이터 조각!!
서버가 클라이언트(브라우저)에 정보를 저장하고, 이후 요청에서 다시 전송하도록 도와주는 역할

➡️ 쿠키는 웹에서 사용자 상태를 유지하는 중요한 메커니즘! 🍪

 

🚀 특징

  • 세션 유지: 로그인 상태 유지, 장바구니 정보 저장
  • 클라이언트 저장: 브라우저에 텍스트 형태로 저장됨
  • 자동 전송: 동일한 도메인에 대한 요청마다 자동 포함


🎯 쿠키 설정 시 추가할 내용

✅ HttpOnly → 자바스크립트에서 접근 불가능하게 해서 보안 강화
✅ Secure → HTTPS에서만 쿠키 전송 (HTTPS 환경이라면 꼭 설정!)
✅ Path=/ → 모든 경로에서 쿠키 사용 가능
✅ Max-Age / Expires

  • Max-Age=604800 (7일) → 만료 시간 설정
  • 설정하지 않으면 세션 쿠키가 되어 브라우저 닫으면 사라짐

 

 

📌 Spring Boot에서 쿠키 설정하는 방법

Spring Boot에서 쿠키를 설정하는 방법은 크게 두 가지다! 🚀
1️⃣ HttpServletResponse.addCookie() 사용 -> 일반 JAVA에서도 이용
2️⃣ ResponseEntity에서 Set-Cookie 사용 -> Spring Boot만 이용 가능

 

✅ 1. HttpServletResponse.addCookie() 사용 (직접 쿠키 추가)

response.addCookie()를 사용해서 쿠키를 설정하는 방법.
사용하기 직관적이고, HttpServletResponse 기반 프로젝트에서 많이 사용된다.

 

📖 response.addCookie()

@PostMapping("/auth/login")
public void login(@RequestBody AuthRequest authRequest, HttpServletResponse response) throws IOException {
    try {
        Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(authRequest.getUsername(), authRequest.getPassword())
        );

        UserDetails userDetails = (UserDetails) authentication.getPrincipal();
        String accessToken = jwtUtil.generateAccessToken(userDetails);
        String refreshToken = jwtUtil.generateRefreshToken(userDetails);

        // ✅ 쿠키 설정
        Cookie refreshTokenCookie = new Cookie("refreshToken", refreshToken);
        refreshTokenCookie.setHttpOnly(true);
        refreshTokenCookie.setSecure(true);  // HTTPS 환경에서는 true 유지
        refreshTokenCookie.setPath("/");
        refreshTokenCookie.setMaxAge(7 * 24 * 60 * 60); // 7일
        response.addCookie(refreshTokenCookie);

        // ✅ JSON 응답 직접 출력
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        response.setStatus(HttpStatus.OK.value());

        Map<String, Object> responseBody = Map.of(
            "success", true,
            "message", "로그인 성공!",
            "accessToken", accessToken
        );

        ObjectMapper objectMapper = new ObjectMapper();
        response.getWriter().write(objectMapper.writeValueAsString(responseBody));

    } catch (AuthenticationException e) {
        response.sendError(HttpStatus.UNAUTHORIZED.value(), "아이디 또는 비밀번호가 올바르지 않습니다.");
    }
}

 

🔥 장점 & 단점

✔ 장점

  • HttpServletResponse를 사용하므로 설정이 직관적
  • response.addCookie()만 호출하면 쉽게 쿠키 추가 가능

 

❌ 단점

  • ResponseEntity와 같이 사용할 수 없음
  • response.getWriter().write()를 직접 호출해야 JSON 응답을 보낼 수 있음

 

✅ 2. ResponseEntity에서 Set-Cookie 헤더 직접 설정

ResponseEntity를 사용할 때는 Set-Cookie 헤더를 추가해서 쿠키를 설정할 수 있다!
Spring Boot에서 권장하는 방식 중 하나야.

 

📖 Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure

@PostMapping("/auth/login")
public ResponseEntity<?> login(@RequestBody AuthRequest authRequest) {
    try {
        Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(authRequest.getUsername(), authRequest.getPassword())
        );

        UserDetails userDetails = (UserDetails) authentication.getPrincipal();
        String accessToken = jwtUtil.generateAccessToken(userDetails);
        String refreshToken = jwtUtil.generateRefreshToken(userDetails);

        // ✅ Set-Cookie 헤더 추가
        String cookieHeader = "refreshToken=" + refreshToken + "; Path=/; HttpOnly; Secure; Max-Age=" + (7 * 24 * 60 * 60);
        HttpHeaders headers = new HttpHeaders();
        headers.add("Set-Cookie", cookieHeader);

        return ResponseEntity.ok()
                .headers(headers)
                .body(Map.of(
                    "success", true,
                    "message", "로그인 성공!",
                    "accessToken", accessToken
                ));

    } catch (AuthenticationException e) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
                .body(Map.of("success", false, "message", "아이디 또는 비밀번호가 올바르지 않습니다."));
    }
}

 

🔥 장점 & 단점

✔ 장점

  • ResponseEntity만 사용 가능 → response.addCookie() 필요 없음
  • Set-Cookie 헤더를 직접 설정하므로 깔끔

 

❌ 단점

  • Set-Cookie 헤더를 직접 다뤄야 해서 설정이 번거로울 수 있음

 

 

🔥 addCookie() VS Set-Cookie

방법 장점 단점
HttpServletResponse.addCookie() 쿠키 설정이 직관적 ResponseEntity 사용 불가
ResponseEntity + Set-Cookie ResponseEntity만 사용 가능 → 깔끔 Set-Cookie 헤더 직접 설정해야 함