쿠키 설정 방법에 대해 알아보기전에 쿠키에 대해 간단히 알아보자!!
🔍 쿠키(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 헤더 직접 설정해야 함 |
'Backend > spring' 카테고리의 다른 글
[error] java.lang.IllegalArgumentException: Name for argument of type [int] not specified (0) | 2025.02.23 |
---|---|
[error] getOutputStream() has already been called for this response (0) | 2025.02.23 |
[Spring Security] CSRF & CORS 개념 및 설정 방법 (0) | 2025.02.23 |
[error] conversionServicePostProcessor Bean 중복 오류 (0) | 2025.02.23 |
[Spring Security] Web vs WebFlux Spring Security 설정 (0) | 2025.02.23 |