Steady Dev - TIL

쿠키(Cookie)

쿠키의 특징

  • 쿠키는 서버가 어떤 데이터를 브라우저 측에 저장한 후 다시 그 데이터를 받아오는 기술 또는 그 데이터 자체를 뜻한다.
  • 쿠키가 잘 작동하기 위해서는 브라우저의 역할이 중요하다.
  • 쿠키는 서버에서도 클라이언트에도 생성할 수 있다.
  • HTTP 메세지의 헤더를 통해 쿠키를 주고받는다
  • 쿠키는 <이름>=<값> 형태이다.
  • 서버는 Set-Cookie라는 응답 헤더에 쿠키 정보를 보냄
  • 하나의 쿠키만 담을 수 있어서 여러개의 쿠키를 보낼 때는 아래와 같은 모습이 된다.
    // http 응답 서버 -> 브라우저
    Set-Cookie: <이름>=<값>
    Set-Cookie: <이름>=<값>
    Set-Cookie: <이름>=<값>
    // http 요청 브라우저-> 서버
    Cookie: <이름>=<값>; <이름>=<값>; <이름>=<값>
  • 서버가 브라우저로 쿠키를 보내는 것은 일회성 작업이지만, 브라우저가 Cookie 헤더를 통해 서버로 쿠키를 돌려보내는 것은 일정 시간동안 반복해서 수행되는 작업이다. (서버가 브라우저에 쿠키 하나 심어 놓으면 그 후로 브라우저는 성실하게 매번 서버를 방문할 때마다 쿠키를 다시 가져온다)
    // http 응답 서버
    Set-Cookie: a=1
    Set-Cookie: b=2
    // http 요청 서버
    Cookie: a=1; b=2
  • 해당 브라우저는 사용자가 www.test.com이라는 도메인에 머무는 한 /index.html을 방문하든 /about.html을 방문하든 /contact.html을 방문하든 매번 같은 쿠키를 돌려줍니다.

쿠키의 한계

  • 쿠키는 유실되기 쉽다.
    • 개발자 도구에서 손쉽게 삭제 가능
  • 쿠키는 변조되기 쉽다.
    • 개발자 도구에서 손쉽게 변경 가능
  • 쿠키는 도난되기 쉽다.
    • 클라이언트 컴퓨터에 저장되어 해킹의 위험에 노출

쿠키의 생명주기

  • 브라우저는 일정 시간동안 계속해서 서버로 쿠키를 돌려보낸다.
  • 유효기간이 별도로 명시되지 않은 쿠키는 세션쿠키 (session cookie)라고 부르는데 브라우저의 세션이 종료될 때 만료된다.즉, 브라우저 탭이나 윈도우를 닫으면 만료된다.
  • 유효기간이 명시되어 있는 쿠키는 영속쿠키(permanent cookie)라고 하여 특정 기간이나 특정 시점까지 유효하다. 유효기간의 명시 방법은 ExpiresMax-Age속성을 사용하면 된다.
Set-Cookie: <쿠키 이름>=<쿠키 값>; Expires=종료 시점
Set-Cookie: <쿠키 이름>=<쿠키 값>; Max-Age=유효 기간
  • Max-Age는 초단위로 설정하고, Expires와 Max-Age 속성이 둘다 있을 경우 Max-Age 속성이 우선된다.
  • 브라우저에 저장해두었던 쿠키를 즉시 만료하고 싶을 때는 Max-Age속성을 0 처리하면된다.

쿠키의 적용범위

Domain

Set-Cookie: <쿠키 이름>=<쿠키 값>; Domain=도메인

Domain속성을 명시하면 서브 도메인까지 포함되도록 쿠키의 범위를 확장시킬수 있다.

예를 들어 Domain 속성을 test.com으로 설정하면 a.test.com으로 부터 받은 쿠키를 b.test.com으로도 보낼 수 있다.

Path

Set-Cookie: <쿠키 이름>=<쿠키 값>; Path=경로

path를 명시하면 쿠키의 범위를 해당 도메인의 특정 경로로 쿠키의 범위를 축소시킬 수 있다.

쿠키의 보안

Secure

Set-Cookie: <쿠키 이름>=<쿠키 값>; Secure

secure을 사용하면 브라우저가 https인경우에만 서버로 돌려보냄

HttpOnly

Set-Cookie: <쿠키 이름>=<쿠키 값>; HttpOnly

HttpOnly는 http를 제외한 js코드가 쿠키에 접근하지 못하도록 함

브라우저에서만 쿠키에 접근할 수 있게 함

이것을 사용하더라도 네트워크를 직접 감청하여 쿠키를 가로챌 수 있다. (https 사용하면 괜찮음 그래서 secure를 사용해야한다.)

Reference