Cookie & Session

준성·2023년 7월 7일
0

Cookie

쿠키는 서버에서 클라이언트에 영속성 있는 데이터를 저장하는 방법이다. 서버는 클라이언트의 쿠키를 이용하여 데이터를 가져올 수 있다.

쿠키를 이용하는 것은 서버에서 클라이언트에 쿠키를 전송하는 것만 의미하지 않고 클라이언트에서 서버로 쿠키를 다시 전송하는 것도 포함된다.

쿠키의 특징

서버가 클라이언트에 특정한 데이터를 저장할 수 있다.

쿠키는 데이터를 저장하고 불러와 사용할 수 있지만 데이터를 저장한 이후 아무 때나 데이터를 가져올 수는 없다. 데이터를 저장한 이후 특정 조건들이 만족되어야 다시 가져올 수 있다.

쿠키의 옵션 종류

1. Domain

흔히 사용하는 서버에 접속할 수 있는 이름이다. 쿠키 옵션에서 도메인은 포트 및 서브 도메인 정보, 세부 경로를 포함하지 않는다. 만약 요청해야하는 URL이 [www.naver.com](http://www.naver.com) 이라 한다면

여기서 도메인은 [naver.com](http://naver.com) 이 된다.쿠키 옵션에서 도메인 정보가 존재한다면 클라이언트에서는 쿠키의 도메인 옵션과 서버의 도메인이 일치해야만 쿠키를 전송할 수 있다.

2. Path

세부 경로로써 서버가 라우팅할 때 사용하는 경로를 의미한다. 요청하는 URL이 http://www.naver.com/news/soccer 인 경우 여기서 Path는 /news/soccer 가 될 것 이며

이를 명시하지 않는다면 기본적으로 / 으로 설정된다. Path 옵션의 특징은 설정된 경로를 포함하는 하위 경로로 요청을 하더라도 쿠키를 서버에 전송할 수 있다.

3. MaxAge or Expires

쿠키가 유효한 기간을 정하는 옵션이다. 쿠키를 오랫동안 보존하면 탈취의 위험이 있기에 유효기간을 설정하는 것이 보안측면에서 중요하다.

MaxAge는 쿠키가 유효한 시간을 초 단위로 설정하는 옵션이다.

Expires는 언제까지 쿠키가 유효한지 날을 지정할 수 있다. 이때 옵션의 값은 클라이언트의 시간을 기준으로 한다.

쿠키는 옵션의 여부에 따라 세션 쿠키(Session Cookie), 영속성 쿠키(Persistent Cookie)로 나눠진다.

세션쿠키: MaxAge 또는 Expires 옵션이 없는 쿠키로, 브라우저가 실행 중일 때 사용할 수 있는 임시 쿠키이다. 브라우저를 종료하면 해당 쿠키는 삭제된다.

영속성 쿠키: 브라우저의 종료 여부와 상관없이 MaxAge 또는 Expires에 지정된 유효시간만큼 사용가능한 쿠키다.

4. Secure

사용하는 프로토콜에 따른 쿠키의 전송 여부를 결정하는 옵션이다. Secure 옵션이 true로 설정된 경우 HTTPS를 이용하는 경우에만 쿠키를 전송할 수 있다.

옵션이 존재하지 않다면 HTTP도 쿠키를 전송할 수 있다. 단 도메인이 [localhost](http://localhost) 인 경우에는 HTTPS가 아니어도 쿠키 전송이 가능하다.

5. HttpOnly

자바스크립트로 브라우저의 쿠키에 접근이 가능한지 여부를 결정한다, 해당 옵션이 true 로 설정된 경우, 자바스크립트로 쿠키에 접근이 불가능하다.

옵션을 명시하지않을 경우 기본적으로 false 로 지정되는데 만약 그렇게 된다면 자바스크립트로 쿠키에 접근할 수 있으므로 탈취될 위험이 있다.

6. SameSite

Cross-Site 요청을 받는 경우에 요청에서 사용한 메서드(GET, POST, PUT)와 해당 옵션의 조합을 기준으로 서버의 쿠키 전송 여부를 결정하게 된다. 이때 Cross-Origin, Cross-Site를

혼동하지 않도록 주의해야한다.

  • Cross-Origin : 서버의 도메인, 프로토콜, 포트 중 하나라도 다른 경우 Cross-Origin으로 구분된다.
    • http://naver.com vs https://naver.com ⇒ 프로토콜이 다르므로 Cross-Origin입니다.
    • https://naver.com:443 vs https://naver.com ⇒ https의 기본 포트는 443입니다. 따라서 도메인, 프로토콜, 포트가 모두 같은 Same-Origin입니다.
  • Cross-Site : eTLD+1 이 다른 경우 Cross-Site로 구분된다.
    • eTLD+1이란?
      • TLD(Top Level Domain) : .com, .org, .kr, 같이 도메인의 가장 마지막 부분을 의미한다.
      • eTLD(Effective Top-Level Domain) : 사이트를 식별할 수 있을 만큼 세분화된 TLD 하위 도메인을 하나 더한 .co.kr , github.io 등을 eTLD라고 판단한다.
      • http://naver.com vs https://naver.com ⇒ 두 주소 모두 eTLD는 .com, eTLD+1은 naver.com으로 같으므로 Same-Site입니다.
      • https://naver.github.io vs https://google.github.io ⇒ 두 주소 모두 eTLD가 github.io로 같지만, eTLD+1은 각각 naver.github.io, google.github.io로 다르므로 Cross-Site입니다.

SameSite 옵션에서 사용할 수 있는 속성은 다음과 같다.

  • Lax : Cross-Site 요청이라면 GET 메서드만 쿠키를 전송할 수 있다.
  • Strict : 가장 엄격한 옵션, Cross-Site가 아닌 Same-Site인 경우에만 쿠키를 전송할 수 있다.
  • None : 항상 쿠키를 내보내줄 수 있다. 다만 쿠키 옵션 중 Secure 옵션이 필요하다.

Session

사용자가 인증에 성공한 상태를 세션이라고 부른다. 이때 서버는 일종의 저장소에 세션을 저장하고 세션이 만들어진다면 세션 아이디도 만들어지는데 클라이언트에 세션 성공을 증명할 수단으로

세션 아이디를 전달한다. 즉 클라이언트는 인증 성공을 증명할 수단을 갖고 있어야하며, 서버는 사용자가 인증에 성공했음을 알고 있어야 한다.

웹사이트에서 로그인을 유지하기 위한 수단으로 쿠키를 사용하는데 쿠키에는 서버에서 발급한 세션 아이디를 저장한다.

profile
코드를 그리다.

0개의 댓글