목차
1. 쿠키와 세션
쿠키와 세션의 가장 큰 차이점은 데이터가 저장되는 위치입니다.
1-1. 쿠키란
쿠키는 웹 서버가 생성하여 웹 브라우저에 전송 및 저장되는 작은 데이터 조각입니다. 웹 사이트는 쿠키를 사용하여 사용자의 브라우저에 정보를 저장하고, 이후 방문 시 이 정보를 참조할 수 있습니다.
1-1-1. 웹 서버에서 쿠키를 전송하는 법
Spring 환경에서 쿠키를 설정하는 방법은 두 가지가 있습니다.
1.
Cookie와 HttpServletResponse를 통해 설정하는 방법
@RestController
public class CookieController {
@GetMapping("/set-cookie")
public ResponseEntity<String> setCookie(HttpServletResponse response) {
// 어딘가 User 조회 로직이 있다고 가정
// Cookie 객체 생성
Cookie cookie = new Cookie("userId", String.valueOf(user.getId());
cookie.setHttpOnly(true); // Http 환경에서만 접근 가능
cookie.setSecure(true); // SameSite를 수행하기 위해 Secure 값은 true여야 함
cookie.setAttribute("SameSite", "None"); // 서로 다른 도메인 간 쿠키 전송에 대한 보안 설정
headers.addCookie(cookie);
// 응답 생성
return ResponseEntity.ok();
}
}
Java
복사
2.
더 높은 추상화를 위해 ResponseEntity를 통해 설정하는 방법
@RestController
public class CookieController {
@GetMapping("/set-cookie")
public ResponseEntity<String> setCookie() {
// Set-Cookie 헤더 추가
HttpHeaders headers = new HttpHeaders();
headers.add("Set-Cookie", "username=JohnDoe; Max-Age=3600; Path=/; HttpOnly; Secure");
// 응답 생성
return ResponseEntity.ok()
.headers(headers)
.body("Cookie has been set");
}
}
Java
복사
@CookieValue를 사용해서 클라이언트 요청 쿠키에 접근
@RestController
public class CookieController {
@GetMapping("/get-cookie")
public String getCookie(@CookieValue(value = "username", defaultValue = "Guest") String username) {
return "Hello, " + username;
}
}
Java
복사
1-1-2. 쿠키 사용과 관련하여 주의할 점
1.
쿠키의 크기 제한은 보통 4KB 입니다. 즉, 작은 데이터의 조각만 저장할 수 있습니다.
2.
쿠키를 포함한 예제에서는 CORS 정책 및 보안 정책에 유의해야 합니다.
실제로 몇몇 경우에 쿠키를 제대로 설정하고 보냈음에도 불구하고 쿠키가 제대로 도착하지 않는 현상을 볼 수 있습니다. 이를 해결하려면 우선 withCredentials 옵션을 활성화하여 요청과 응답에 쿠키 값을 포함하도록 설정해야 합니다.
Credentials 이란?
Credentials는 인증과 관련된 데이터를 포함하는 개념으로, 다음을 포함합니다:
•
쿠키: 서버와 클라이언트 간의 상태를 유지하기 위해 사용하는 데이터.
•
Authorization 헤더: 사용자 인증을 위한 토큰이나 인증 정보를 포함.
•
TLS 클라이언트 인증서: HTTPS 통신에서 클라이언트를 식별하기 위한 인증서.
이 정보는 보안상 민감하기 때문에, 브라우저는 기본적으로 요청이나 응답에서 이러한 데이터를 자동으로 포함하지 않습니다.
브라우저에서 제공하는 기본적인 요청 API는 보안 강화 를 위해 쿠키와 같은 민감한 인증 데이터를 자동으로 요청 또는 응답에 포함하지 않습니다. 이는 CSRF와 같은 공격을 방지하기 위한 것입니다.
다시 돌아와서 쿠키나 인증 헤더 정보를 포함시켜 요청하고 싶다면, 클라이언트, 서버 양 단에 Access-Control-Allow-Credentials 헤더를 true로 변경해주어야 합니다.
Spring 코드
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins(
"http://localhost:8080",
"http://localhost:4000"
)
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true); // 자격 증명 허용
}
}
Java
복사
React 코드
const axiosBaseURL = axios.create({
baseURL: process.env.PUBLIC_URL,
withCredentials: true,
});
Java
복사
쿠키는 사용자의 브라우저에 직접 저장되므로, 사용자가 직접 삭제하지 않는 한 오랫동안 데이터를 유지할 수 있습니다. 하지만, 쿠키는 상대적으로 쉽게 탈취될 수 있어 보안에 취약합니다.
쇼핑몰 사이트에서 장바구니 기능을 구현할 때는 쿠키를 사용하여 사용자의 장바구니 정보를 저장할 수 있습니다. 이를 통해 사용자가 사이트를 나갔다가 다시 방문해도 장바구니의 상태를 유지할 수 있습니다.
이 외에도 사용자의 선호 언어 설정, 페이지 테마 설정 등 사용자의 환경 설정을 저장하는 데 쿠키를 활용할 수 있습니다.
1-2. 세션이란
세션의 서버에 저장됩니다.