twocowsong

[모든 개발자를 위한 HTTP 웹 기본 지식 - 28] 본문

IT/HTTP

[모든 개발자를 위한 HTTP 웹 기본 지식 - 28]

WsCode 2022. 1. 29. 23:44

쿠키

Set-Cookie: 서버에서 클라이언트로 쿠키 전달(응답)

Cookie: 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달

 

HTTP는 무상태 프로토콜입니다. 서버에서는 클라이언트의 상태를 가지고있지않습니다.

서버가 클라이언트의 상태를 저장하기위해서 세션과 쿠키가있습니다. 쿠키의 경우 클라이언트가 서버에게 요청 후 서버는 해당 값으로 쿠키를 생성시켜 웹브라우저 쿠키저장소에 저장합니다. 

@GetMapping("/login")
@ResponseBody
public void login(HttpServletResponse response) throws Exception{
    Cookie createCookie = new Cookie("userName", "홍길동");
    createCookie.setMaxAge(3600);
    createCookie.setPath("/");

    response.addCookie(createCookie);
    response.sendRedirect("/main");
}

 

 

 

앞으로의 클라이언트에 대한 모든 요청은 쿠키를 자동으로 포함하기때문에 사용자가 하나하나 정보를 추가하지않아도 서버에서는 쿠키값을 확인할수있습니다.

@GetMapping("/main")
@ResponseBody
public String init(HttpServletRequest request) {
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            log.info("cookie name , value : {} , {}", cookie.getName(), cookie.getValue());
        }
    }
    return "ok";
}

 

쿠키를 삭제하는법은 아래와같습니다.

@GetMapping("/delete")
@ResponseBody
public String delete(HttpServletResponse response) {
    Cookie createCookie = new Cookie("userName", null);
    createCookie.setMaxAge(0);
    createCookie.setPath("/");
    response.addCookie(createCookie);
    return "ok";
}

 

쿠키사용시 아래점은 꼭 확인해주시고 사용해주세요.

• 쿠키 정보는 항상 서버에 전송됨

• 네트워크 트래픽 추가 유발

• 최소한의 정보만 사용(세션 id, 인증 토큰)

• 서버에 전송하지 않고, 웹 브라우저 내부에 데이터를 저장하고 싶으면 웹 스토리지 (localStorage, sessionStorage) 참고 • 주의!

  • 보안에 민감한 데이터는 저장하면 안됨(주민번호, 신용카드 번호 등등)

 

쿠키 - 생명주기

• Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT

• 만료일이 되면 쿠키 삭제

• Set-Cookie: max-age=3600 (3600초)

• 0이나 음수를 지정하면 쿠키 삭제

• 세션 쿠키: 만료 날짜를 생략하면 브라우저 종료시 까지만 유지

• 영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지

 

쿠키 - 도메인 Domain

• 예) domain=example.org

• 명시: 명시한 문서 기준 도메인 + 서브 도메인 포함

• domain=example.org를 지정해서 쿠키 생성

• example.org는 물론이고 dev.example.org도 쿠키 접근

 

• 생략: 현재 문서 기준 도메인만 적용

• example.org 에서 쿠키를 생성하고 domain 지정을 생략

• example.org 에서만 쿠키 접근 dev.example.org는 쿠키 미접근

 

쿠키 - 경로 Path

• 예) path=/home

• 이 경로를 포함한 하위 경로 페이지만 쿠키 접근

• 일반적으로 path=/ 루트로 지정

• 예) path=/home 지정

• /home -> 가능

• /home/level1 -> 가능

• /home/level1/level2 -> 가능

• /hello -> 불가능

 

쿠키 - 보안 Secure, HttpOnly, SameSite

• Secure

• 쿠키는 http, https를 구분하지 않고 전송

• Secure를 적용하면 https인 경우에만 전송

• HttpOnly  XSS 공격 방지

• 자바스크립트에서 접근 불가(document.cookie)

• HTTP 전송에만 사용

• SameSite

• XSRF 공격 방지

• 요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송