스프링/개념

Cookie 와 Cookie Login

문상휘파람 2024. 9. 23. 17:13

쿠키란 무엇인가?

  • 쿠키는 사용자의 웹 브라우저에 저장되는 작은 데이터 조각입니다.

왜 쿠키를 써야 하는가? - 인증의 필요성

  • HTTP 프로토콜의 특징으로 인해 필요합니다.
    • 비연결성 : 클라이언트가 서버에 요청을 하고나서 그에 걸맞는 응답을 보낸 후 서버와 클라이언트의 연결을 끊는 방식입니다.
    • 무상태 : 커넥션이 끊는 순간 이후로 어떠한 상태정보를 유지하지않는 특성입니다.

서버는 클라이언트 기억하지 못함 -> 계속 기억시켜 줌 :: 이것이 인증


쿠키의 장단점

장점

  1. 클라이언트 측에 상태 저장:
    • 클라이언트에서 상태 정보를 저장할 수 있어 서버 자원 절약이 가능합니다.
  2. 자동 요청 전송:
    • 브라우저가 자동으로 쿠키를 서버에 포함시켜 전송하므로 개발자가 별도의 처리 없이 상태 유지 가능합니다.
  3. 상태 유지:
    • 정보를 저장하여, 사용자가 웹사이트를 다시 방문할 때 기존 정보 유지 가능합니다.

단점

  1. 보안 위험:
    • 쿠키는 클라이언트 측에 저장 -> 쿠키를 탈취하거나 변조할 위험이 있음.
    • HTTP로 전송될 경우, 네트워크에서 쿠키가 탈취될 수 있습니다.
  2. 크기 제한:
    • 쿠키는 보통 4KB 정도의 크기 제한이 있어, 큰 데이터를 저장하거나 복잡한 상태를 유지하는 데 한계 존재합니다.
  3. 성능 문제:
    • 요청마다 쿠키가 자동으로 서버에 전송되므로, 쿠키 크기가 크거나 많은 쿠키가 있을 경우 네트워크 트래픽이 증가합니다.
  4. 사용자 관리 필요:
    • 쿠키는 클라이언트가 직접 변조 가능 -> 데이터 무결성이 보장X.

쿠키의 동작 원리

  1. 쿠키 생성 및 저장
    • 서버가 쿠키를 생성: 클라이언트(웹 브라우저)가 서버에 요청을 보내면, 서버는 응답에 쿠키를 포함시킵니다. 이 쿠키는 Set-Cookie라는 HTTP 헤더에 포함되어 전달합니다.
    • 클라이언트가 쿠키를 저장: 브라우저는 서버로부터 받은 쿠키를 클라이언트의 로컬 스토리지(브라우저의 쿠키 저장소)에 저장합니다. 쿠키에는 이름, 값, 만료 시간, 경로 등의 정보가 포함되어 있습니다.
  2. 쿠키 전송
    • 쿠키 전송: 이후 클라이언트가 동일한 서버에 요청을 보낼 때, 브라우저는 해당 요청에 자동으로 저장된 쿠키를 포함시켜서 같이 보냅니다. => HTTP 요청의 Cookie 헤더에 쿠키 정보가 포함되어 서버로 전달됩니다.
    • 서버가 쿠키를 읽음: 서버는 클라이언트가 보낸 쿠키를 읽고, 쿠키의 값을 기반으로 사용자 식별합니다.
  3. 쿠키의 만료 및 삭제
    • 만료 시간: 쿠키에는 만료 시간이 설정할 수 있습니다. 만료 시간이 지나면, 브라우저는 해당 쿠키를 자동으로 삭제합니다.
    • 수동 삭제: 사용자는 브라우저 설정을 통해 수동으로 쿠키를 삭제 가능합니다.

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);

Ref. https://www.baeldung.com/java-servlet-cookies-session