관리 메뉴

범슈의 연구실

Cookie 본문

DEV/Backend

Cookie

berom 2023. 5. 25. 09:04
728x90

Cookie

쿠키는 ASCII 문자로만 된 이름과 값의 쌍으로 구성된 작은 정보입니다.
보통 쿠키는 클라이언트 식별 기술로 사용됩니다.
서버에서는 저장된 쿠키를 읽어 사용자를 식별합니다

서버에서 생성 되어 사용자의 브라우저로 전송되어 저장됩니다.
이 때 쿠키에는 유효기간, 도메인, 경로도 같이 포함 되어 전송됩니다

유효기간
쿠키에 저장된 유효기간에 도달하면, 쿠키는 자동으로 삭제 됩니다.
또한, 쿠키에는 상대시간과 절대 시간이 모두 기록되어서, 쿠키가 만료 시기를 결정하는데 도움을 줍니다

경로
사용자가 서버에 요청을 보낼 때마다, 브라우저는 요청의 도메인과 경로가 쿠키의 경로와 일치하는 경우에만 요청과 함께 쿠키를 자동으로 보냅니다

Cookie 왜 쓰는가?

쿠키는 HTTP의 Stateless에 기인한 문제의 해결책으로 등장하였습니다

HTTP 프로토콜은 상태를 저장하지 않기 때문에, 사용자가 한 페이지에서 다른 페이지로 이동 할 때 사용자의 작업을 추적하기 쉽지 않습니다
이 때 쿠키는 사용자의 컴퓨터에 작은 데이터(사용자 ID, 세션 토큰 등)를 저장함으로써 상태를 저장하는 듯 동작할 수 있도록합니다

Cookie 다루는 방법

Cookie 생성

Cookie cookie = new Cookie("key", "value")
cookie.setMaxAge(60*60*24);
response.addCookie(cookie)

서버 측에서 key-value를 지정해서 Cookie를 생성합니다
이 때, 유효 기간 등의 기타 설정을 하고, 응답에 쿠키를 추가하여 클라이언트에게 전송합니다


위의 HTTP Response를 보면, 작성한 코드가 실려 있는 것을 볼 수 있습니다
set-cookie, id, max-Age, Expires(유효 기간 설정) 등으로 맵핑 되었습니다

Cookie 삭제와 변경

아래와 같이 쿠키를 삭제 할 수 있습니다.

Cookie cookie = new Cookie("id",""); //변경할 쿠키와 같은 이름 생성
cookie.setMaxAge(0) // 유효 기간을 0으로 설정(삭제)
response.addCookie(cookie) // 응답에 쿠키 추가

삭제와 비슷하게, 설정 또한 가능합니다

Cookie cookie = new Cookie("id",""); //변경할 쿠키와 같은 이름 생성
cookie.setValue(URLEncoder.encode("남궁성")) // 값 변경
cookiet.setDomain("naver.com") //도메인 변경
cookie.setPath("/ch2") // 경로 변경
cookie.setMaxAge(60*60) // 유효 기간 설정
response.addCookie(cookie) // 응답에 쿠키 추가

Cookie 읽어오기

Cookie[] cookies = request.getCookies();
for(Cookie cookie: cookies){
	String name = cookie.getName();
	String value = cookie.getValue();
	System.out.printf("[cookie]name=%s, value=%s%n, name, value")
}

위와 request와 같이 서버로부터 온 응답으로부터 쿠키를 추출할 수 있습니다.
또는, 브라우저의 개발자 도구 - 애플리케이션에 가서도 확인 할 수 있죠

더 나아가서, Spring의 MVC에서는 Controller 내 메소드의 인자로 바로 맵핑 후 반환해주기도 합니다

import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CookieController {

    @GetMapping("/getCookie")
    public String getCookie(@CookieValue(value = "cookieName", defaultValue = "Cookie not found") String cookie) {
        return "Value of cookie 'cookieName': " + cookie;
    }
}

쿠키 차단에서 살아남는 방법 : URL 재작성

URL 재작성은 클라이언트가 쿠키를 비활성화한 경우 세션 상태를 유지하기 위해 사용되는 기술입니다.
서버는 제공되는 페이지의 각 하이퍼링크 URL에 세션 ID를 첨부합니다.

클라이언트가 링크를 선택하면, 서버는 URL에서 세션 ID를 읽고 이를 사용하여 올바른 세션 데이터를 가져올 수 있습니다.

Java Servlet과 JSP 기술에서는 HttpServletResponseencodeURL() 또는 encodeRedirectURL() 메서드를 사용하여 URL에 세션 ID를 포함시킬 수 있습니다:

String url = response.encodeURL("/nextPage.jsp");

이러한 메서드들은 쿠키가 비활성화된 경우 세션 ID가 포함된 URL을 반환합니다. 그렇지 않으면 변경되지 않은 URL을 반환합니다.

URL 재작성이 사용될 때, 서버는 제공된 페이지의 모든 상대 URL에 자동으로 세션 ID를 추가합니다.
이는 쿠키가 차단되었을 때 URL에 JSESSIONID를 포함시킬 수 있게 합니다.

실제로, Spring에서는 쿠키가 차단 된 상황에 대비하여 처음 서버에 요청을 보낼 때는 무조건 jsessionid를 붙여주고, 응답 헤더를 통해서도 데이터를 보냅니다

하지만 ID가 URL이 노출 된다는 취약점 때문에, URL 재작성은 쿠키를 사용할 수 없을 때 대비책으로 종종 사용됩니다.

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>