내일배움캠프 22일차 TIL : Spring - Cookie

김원기·2024년 5월 22일

TIL

목록 보기
26/42
post-thumbnail

내일배움캠프 22일차 TIL : Spring - Cookie

Cookie

Cookie는 클라이언트에 저장될 목적으로 생성된 작은 정보를 담는 파일

Cookie는 HTTP 기록서의 일종으로 User가 어떠한 웹 사이트를 방문할 경우 사이트가 사용하고 있는 서버를 통해 User의 컴퓨터에 설치되는 작은 기록 정보 파일을 일컫는다.


https://ychcom.tistory.com/entry/%EC%BF%A0%ED%82%A4Cookie%EB%9E%80

  • Name : 쿠키를 구별하는 데 사용되는 키, 중복이 불가함
  • Value : 쿠키의 값
  • Expires : 유효 기간이 지나면 쿠키 데이터가 소멸한다.
  • Domain : 현재 쿠키가 어떤 서버로 전송되어져야 하는지 지정하는 속성.
  • Path : Path로 지정한 곳에서 쿠키 데이터를 읽을 수 있다.

Cookie는 보안적으로 중요하지 않아도 되면서, 서버에서 클라이언트의 정보를 트래킹하고 싶은 경우 사용된다.

Cookie의 정보는 HTTP Header에 노출되므로 비밀번호와 같은 중요정보는 담으면 안된다.

Cookie의 동작 방식

쿠키는 Key : Value 형태의 데이터이다.

  1. Client가 서버로 요청을 보낸다.
  2. 서버에서 request header에 Cookie key의 Value를 확인한다.
  3. 데이터가 있으면 해당 서버에서 설정한 Cookie가 있는지 확인한다.
    3-1. 설정한 Cookie가 없다면 ResponseHeader의 set-cookie key의 value로 Cookie를 발급한다.
    3-2. 해당 Cookie를 사용한다.
  4. Client(Browser)에서 응답을 받았을 때, set-Cookie가 있다면 로컬 쿠키 저장소로 저장한다.

Cookie의 생성과 확인

Cookie의 생성

쿠키의 생성 방법은

  1. Cookie cookie = new Cookie()처럼 메서드를 사용해 쿠키를 생성한다.
  2. Cookie 생성 시 Key, Value를 넣어준다.
  3. Cookie의 유효시간 (Expires or Max-age)를 지정한다.(권장)
  4. 유효 시간까지 정해준 쿠키를 HttpServletResponse 객체인 response에 addCookie를 통해 쿠키를 태워서 전송

위의 과정을 코드로 보도록 하겠다. 저번과 같이 코드 주석으로 표현

public class AuthController {

    public static final String AUTHORIZATION_HEADER = "Authorization";

    @GetMapping("/create-cookie")
    public String createCookie(HttpServletResponse res) {
	    // 0. api를 통해 Cookie 생성하는 부분을 호출한다.
        // 여기서 "Cookie Auth"가 Cookie의 value가 된다.
        addCookie("Cookie Auth", res); 

        return "createCookie";
    }
    ...
    public static void addCookie(String cookieValue, HttpServletResponse res) {
        try {
            cookieValue = URLEncoder.encode(cookieValue, "utf-8").replaceAll("\\+", "%20"); // Cookie Value 에는 공백이 불가능해서 encoding 진행
            
            //	1.	Cookie를 생성한다. 
            //	2.	차례대로 Key, Value값이 들어간다.
            Cookie cookie = new Cookie(AUTHORIZATION_HEADER, cookieValue); // Name-Value
            // 2-1. 경로를 지정해준다. -> localhost:8080/
            cookie.setPath("/");
            // 3. setMaxAge를 통해 쿠키의 유효 시간을 설정한다.
            cookie.setMaxAge(30 * 60);

            // 4. Response 객체에 Cookie 추가
            // HttpServletResponse 객체에 쿠키를 태워서 전송한다.
            res.addCookie(cookie);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e.getMessage());
        }
    }
}

Cookie의 확인

쿠키를 생성했으니 쿠키를 확인해봐야겠다. 확인하는 방법은 다음과 같다.
(순차적인 느낌보다는 종류의 1, 2)

  1. 쿠키를 넣었다면 다음 요청부터는 넣어준 쿠키가 자동으로 넘어온다.
  2. @CookieValue 어노테이션을 이용해 쿠키 값을 받아올 수 있다.
    2-1. @CookieValue 어노테이션에 required 속성이 존재한다.
    required = true로 지정하면 쿠키가 존재하지 않을 경우 예외가 발생한다.
@RestController
@RequestMapping("/api")
public class AuthController {
	
    public static final String AUTHORIZATION_HEADER = "Authorization";
    ... 
    
    @GetMapping("/get-cookie")
    // Cookie의 Key가 AUTHORIZATION_HEADER 인 쿠키를 찾아 value를 가져온다.
    public String getCookie(@CookieValue(AUTHORIZATION_HEADER) String value) {
        System.out.println("value = " + value);

        return "getCookie : " + value;
    }
    
    ...
    // 2-1. 해당 쿠키가 없는 경우에도 메소드가 호출된다. 
    // 따라서 쿠키의 값이 없을 때에도 value 매개변수는 null이 아닌 빈 문자열로 초기화한다.
    public String getCookie(@CookieValue(value = AUTHORIZATION_HEADER, required = false) String value) {
}

끝!

참고

원래 Session이랑 JWT까지 하려했는데....
심지어 HttpServletRequest를 이용해서 쿠키를 가져오는 방식이 하나 더 있긴한데 이건...

profile
혼자 공부하는 블로그라 부족함이 많아요 https://www.notion.so/18067a27ac7e4f4790dde645fb3bf3d3?pvs=4

0개의 댓글