Cookie, Session

이동건·2024년 10월 13일

Web

목록 보기
3/6

Why?

HTTP Protocol의 특징이자 약점을 보완하기 위해 사용한다. 기본적으로 HTTP는 Connectionless, Stateless 특징을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인을 해야한다. 이 특징들을 보완하기 위해 Cookie와 Session을 사용한다.

Connectionless - 비연결지향

클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어버리는 특징을 가짐.

Stateless - 상태 없음

통신이 끝나면 상태를 유지하는 특징을 가짐.

Cookie

쿠키(Cookie) 는 사용자가 웹 사이트를 방문할 때 웹 서버에서 사용자 컴퓨터에 저장하는 작은 데이터 파일이다. 클라이언트(브라우저)에 상태 정보를 저장해 두고, 필요할 때 이를 참조하거나 재사용할 수 있게 해준다.

주요 특징

클라이언트 상태 정보 저장 : 웹 서버는 클라이언트(브라우저)에 사용자의 상태 정보를 저장하여, 이를 필요할 때 다시 불러와 재사용할 수 있다.
예를 들어, 로그인 상태나 장바구니 정보 등을 쿠키에 저장할 수 있다.

작은 데이터 파일 : 쿠키는 key-value 쌍으로 이루어진 작은 데이터 파일이다. 이 파일은 클라이언트의 로컬에 저장되며, 서버와의 상호작용에 사용된다.

유효 시간 설정 가능 : 쿠키에는 유효 시간을 설정할 수 있으며, 만약 유효 시간이 지정되어 있다면 브라우저가 종료된 후에도 쿠키가 유지된다. 이를 통해 세션이 만료되지 않는 한 로그인 상태를 유지하거나 특정 설정이 기억될 수 있다.

자동 전송 : 쿠키는 사용자가 웹사이트에 재방문할 때 별도의 요청 없이 자동으로 Request Header에 포함되어 서버에 전송된다. 서버는 이를 통해 사용자를 식별하거나 상태를 유지할 수 있다.

저장 제한 :

클라이언트에 저장 가능한 쿠키 수 : 브라우저는 클라이언트 로컬에 최대 300개의 쿠키를 저장할 수 있다.
도메인당 저장 가능 쿠키 수 : 하나의 도메인에 대해 최대 20개의 쿠키를 저장할 수 있다.
쿠키 크기 제한 : 각 쿠키의 크기는 최대 4KB까지 저장할 수 있다.

쿠키 생성 : 서버가 클라이언트에 쿠키를 생성하도록 하려면 HTTP 응답 헤더에 Set-Cookie 속성을 포함해야 한다. 이 속성을 통해 쿠키가 클라이언트에 저장되며, 이후 클라이언트는 해당 쿠키를 서버에 자동으로 전송한다.

구성 요소

  1. Name
    쿠키를 구분하는 고유한 식별자이다. 서버와 클라이언트는 이 이름을 사용하여 각 쿠키를 식별한다.

  2. Value
    쿠키의 이름과 연결된 값으로, 실제로 저장하고 싶은 데이터이다. 이 값은 클라이언트와 서버 간의 상호작용에 사용된다.

  3. Expires/Max-age
    쿠키의 만료 시간을 지정하는 속성이다. 만료 시간이 설정되면, 해당 시간까지 쿠키가 유지되며, 그 이후에는 자동으로 삭제된다. 만료 시간이 설정되지 않으면, 브라우저가 종료될 때 쿠키는 삭제된다. (Session Cookie)

  4. Domain
    쿠키가 전송될 도메인을 지정한다. 이를 통해 특정 도메인(또는 하위 도메인)에만 쿠키가 전송된다.

  5. Path
    쿠키를 전송할 경로를 정의한다. 경로는 특정 디렉토리나 페이지에 한정하여 쿠키가 적용되도록 설정할 수 있다.

httpOnly

이 옵션은 웹서버에서 Set-Cookie 헤더를 이용해 쿠키를 설정할 때 지정할 수 있습니다. 이 옵션은 javascript 같은 클라이언트 측 script가 쿠키를 사용할 수 없게 한다.

res.cookie("session_id", "12345", {
  httpOnly: true,
  path: "/",
});

이렇게 설정하는 이유는 해커가 XSS(Cross Site Script) 공겨기법을 이용해 쿠키정보를 탈취하는 것을 예방하기 위해서이다.

Session

세션(Session)은 동일한 클라이언트가 웹 서버에 접속한 시점부터 브라우저를 종료할 때까지의 일련의 요청을 하나의 상태로 묶어 관리하는 방식이다. 이를 통해 클라이언트와 서버 간의 논리적인 연결 상태를 유지할 수 있으며, 서버는 클라이언트에게 고유한 Session ID를 부여하며, 클라이언트는 이 Session ID를 요청과 함께 서버로 전송해 자신의 상태를 확인받는다. 서버는 세션에 대한 정보를 저장해 사용자의 상태를 추적하고, 세션이 만료되거나 브라우저가 종료되면 세션은 종료된다.

Session 동작 과정

  1. 클라이언트의 첫 요청
    사용자가 브라우저를 통해 웹 서버에 처음으로 요청을 보내면, 서버는 해당 클라이언트와의 세션을 생성한다. 이때 서버는 클라이언트를 식별할 수 있는 고유한 식별자, 즉 Session ID를 생성한다.

  2. Session ID 부여
    서버는 생성된 Session ID를 클라이언트에게 전달한다. 이 Session ID는 쿠키, URL 파라미터, 또는 HTTP 헤더 등을 통해 클라이언트 측에 전달될 수 있으며, 이를 통해 이후의 모든 요청에서 해당 세션을 참조할 수 있다.

  3. Session 저장
    서버는 클라이언트와 관련된 상태 정보를 서버 측에 저장한다. 여기에는 로그인 정보, 장바구니 데이터, 사용자 설정 등의 정보가 포함될 수 있다. 이 정보는 클라이언트의 세션과 연관지어 관리된다.

  4. Session 유지
    클라이언트가 추가 요청을 보낼 때마다, 이전에 발급된 Session ID를 서버에 함께 전송한다. 서버는 이 Session ID를 기반으로 해당 클라이언트의 세션 데이터를 조회하고, 이를 통해 사용자의 상태를 유지한다.

  5. Session 종료
    세션은 일정 시간이 지나거나(유효 시간 만료), 사용자가 명시적으로 로그아웃하거나, 브라우저가 종료되면 종료된다. 세션이 종료되면 서버는 더 이상 클라이언트의 상태 정보를 유지하지 않으며, 새로운 세션이 필요하게 된다.

Session 관리 방식

쿠키 기반 세션 관리

서버는 Session ID를 클라이언트의 브라우저에 쿠키로 저장한다. 이후 클라이언트가 웹 서버에 요청할 때마다 브라우저는 해당 Session ID를 함께 전송하여 서버가 세션을 참조할 수 있도록 한다.

URL 파라미터 기반 세션 관리

쿠키를 사용할 수 없는 환경에서는 Session ID를 URL에 포함시켜 관리할 수 있다. 이 방법은 보안성이 떨어지므로 주로 쿠키 기반 관리가 선호된다.

Cookie와 Session의 차이점

Session은 상태 정보를 서버 측에 저장하고, 클라이언트는 Session ID만을 유지하는 반면, 쿠키는 클라이언트 측에 상태 정보를 직접 저장한다. Session은 서버 자원을 사용하므로 클라이언트 수가 많아질수록 서버 부하가 증가하지만, 보안 측면에서 쿠키보다 안전하다. 쿠키는 클라이언트 측에 저장되기 때문에 사용자가 정보를 조작할 가능성이 있지만, Session은 그런 위험이 적다.

profile
🫠🥱

0개의 댓글