Search

네트워크 톺아보기

목차

1. 쿠키와 세션

쿠키와 세션의 가장 큰 차이점은 데이터가 저장되는 위치입니다.

1-1. 쿠키란

쿠키는 웹 서버가 생성하여 웹 브라우저에 전송 및 저장되는 작은 데이터 조각입니다. 웹 사이트는 쿠키를 사용하여 사용자의 브라우저에 정보를 저장하고, 이후 방문 시 이 정보를 참조할 수 있습니다.

1-1-1. 웹 서버에서 쿠키를 전송하는 법

Spring 환경에서 쿠키를 설정하는 방법은 두 가지가 있습니다.
1.
CookieHttpServletResponse를 통해 설정하는 방법
@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. 세션이란

세션의 서버에 저장됩니다.

1-3. 세션 방식의 로그인 과정에 대해 알아보자