쿠키란 무엇인가?
- 쿠키는 사용자의 웹 브라우저에 저장되는 작은 데이터 조각입니다.
왜 쿠키를 써야 하는가? - 인증의 필요성
- HTTP 프로토콜의 특징으로 인해 필요합니다.
- 비연결성 : 클라이언트가 서버에 요청을 하고나서 그에 걸맞는 응답을 보낸 후 서버와 클라이언트의 연결을 끊는 방식입니다.
- 무상태 : 커넥션이 끊는 순간 이후로 어떠한 상태정보를 유지하지않는 특성입니다.
서버는 클라이언트 기억하지 못함 -> 계속 기억시켜 줌 :: 이것이 인증
쿠키의 장단점
장점
- 클라이언트 측에 상태 저장:
- 클라이언트에서 상태 정보를 저장할 수 있어 서버 자원 절약이 가능합니다.
- 자동 요청 전송:
- 브라우저가 자동으로 쿠키를 서버에 포함시켜 전송하므로 개발자가 별도의 처리 없이 상태 유지 가능합니다.
- 상태 유지:
- 정보를 저장하여, 사용자가 웹사이트를 다시 방문할 때 기존 정보 유지 가능합니다.
단점
- 보안 위험:
- 쿠키는 클라이언트 측에 저장 -> 쿠키를 탈취하거나 변조할 위험이 있음.
- HTTP로 전송될 경우, 네트워크에서 쿠키가 탈취될 수 있습니다.
- 크기 제한:
- 쿠키는 보통 4KB 정도의 크기 제한이 있어, 큰 데이터를 저장하거나 복잡한 상태를 유지하는 데 한계 존재합니다.
- 성능 문제:
- 요청마다 쿠키가 자동으로 서버에 전송되므로, 쿠키 크기가 크거나 많은 쿠키가 있을 경우 네트워크 트래픽이 증가합니다.
- 사용자 관리 필요:
- 쿠키는 클라이언트가 직접 변조 가능 -> 데이터 무결성이 보장X.
쿠키의 동작 원리
- 쿠키 생성 및 저장
- 서버가 쿠키를 생성: 클라이언트(웹 브라우저)가 서버에 요청을 보내면, 서버는 응답에 쿠키를 포함시킵니다. 이 쿠키는 Set-Cookie라는 HTTP 헤더에 포함되어 전달합니다.
- 클라이언트가 쿠키를 저장: 브라우저는 서버로부터 받은 쿠키를 클라이언트의 로컬 스토리지(브라우저의 쿠키 저장소)에 저장합니다. 쿠키에는 이름, 값, 만료 시간, 경로 등의 정보가 포함되어 있습니다.
- 쿠키 전송
- 쿠키 전송: 이후 클라이언트가 동일한 서버에 요청을 보낼 때, 브라우저는 해당 요청에 자동으로 저장된 쿠키를 포함시켜서 같이 보냅니다. => HTTP 요청의 Cookie 헤더에 쿠키 정보가 포함되어 서버로 전달됩니다.
- 서버가 쿠키를 읽음: 서버는 클라이언트가 보낸 쿠키를 읽고, 쿠키의 값을 기반으로 사용자 식별합니다.
- 쿠키의 만료 및 삭제
- 만료 시간: 쿠키에는 만료 시간이 설정할 수 있습니다. 만료 시간이 지나면, 브라우저는 해당 쿠키를 자동으로 삭제합니다.
- 수동 삭제: 사용자는 브라우저 설정을 통해 수동으로 쿠키를 삭제 가능합니다.
SpringBoot 쿠키 사용법
* 쿠키 생성(jakarta.servlet.http 패키지의 Cookie 클래스), response.addCookie() 메서드를 사용하여 클라이언트로 전송 가능
Cookie uiColorCookie = new Cookie("color", "red");
response.addCookie(uiColorCookie);
* 쿠키의 만료 시간 설정. 쿠키의 유효 기간을 설정하려면 maxAge(int) 메서드를 사용. (예시는 1시간 설정)
uiColorCookie.setMaxAge(60*60);
* 쿠키의 도메인 설정. setDomain(String) 메서드를 사용. (예시는 쿠키를 example.com 도메인과 그 하위 도메인에 전달되도록 설정)
uiColorCookie.setDomain("example.com");
* 쿠키의 경로 설정. 쿠키가 전달될 경로를 설정하려면 setPath(String) 메서드를 사용. (예시는 쿠키를 /welcomeUser 경로와 그 하위 경로에만 전달되도록 설정)
uiColorCookie.setPath("/welcomeUser");
* 도에인과 경로 설정 같이 하는 방법.
Cookie uiColorCookie = new Cookie("color", "red");
uiColorCookie.setDomain("example.com"); // example.com 도메인과
uiColorCookie.setPath("/user"); // /user 경로에 대해 유효하게 설정
response.addCookie(uiColorCookie);
** 이런식으로 하위에 전달되도록 설정하면, 따로 넘어갈때 쿠키 보내주지 않아도 됌. **
* 서블릿에서 쿠키 읽기. 클라이언트는 요청 시 저장된 쿠키를 함께 보냄 -> 서블릿에서는 HttpServletRequest의 getCookies() 메서드를 사용하여 모든 쿠키를 가져올 수 있음. -> 읽어들여서 검증 가능.
public Optional<String> readCookie(String key) {
return Arrays.stream(request.getCookies())
.filter(c -> key.equals(c.getName()))
.map(Cookie::getValue)
.findAny();
}
* 쿠키 삭제. 쿠키를 삭제하려면 동일한 이름의 쿠키를 생성하되, maxAge 값을 0으로 설정하여 클라이언트에 추가.
Cookie userNameCookieRemove = new Cookie("userName", "");
userNameCookieRemove.setMaxAge(0);
response.addCookie(userNameCookieRemove);
'스프링 > 개념' 카테고리의 다른 글
@Data 어노테이션에 관하여 (0) | 2024.09.30 |
---|---|
Session 과 Session Login (0) | 2024.09.23 |
엔티티(Entity) - 왜 기본 생성자가 필요할까? (0) | 2024.09.10 |
엔티티 매니저와 영속성 컨텍스트 (0) | 2024.09.10 |
JPA 에 관하여 [자바 ORM 표준 JPA 프로그래밍] (0) | 2024.09.10 |