[Node.js] Cookie vs Session

유동균·2023년 2월 5일
0

Node.js

목록 보기
4/11
post-thumbnail

비연결성(Connectionless)과 비상태성(Stateless)

  • HTTP 프로토콜에는 비연결성(Connectionless)과 비상태성(Stateless)이라는 특징이 있다.

  • 이는 서버의 자원을 절약하기 위해 모든 사용자의 요청마다 연결과 해제의 과정을 거치기 때문에 연결 상태가 유지되지 않고, 연결 해제 후에 상태 정보가 저장되지 않는다는 것이다.

  • 하지만, 이로 인해 사용자를 식별할 수 없어서 같은 사용자가 요청을 여러번 하더라도 매번 새로운 사용자로 인식하는 단점이 있다.

  • 하지만 우리가 사용하고 있는 웹사이트를 생각해보면, 로그인을 한 번 하고나면 그 사이트에서는 다시 로그인할 필요 없이 여러 페이지의 기능들을 이용할 수 있고 심지어 브라우저를 종료했다가 나중에 다시 접속했을 때도 그 로그인 상태를 유지할 수도 있다.

  • 이렇게 HTTP의 비연결성과 비상태성을 보완하여 서버가 클라이언트를 식별하게 해주는 것이 쿠키와 세션이다.

    • 비연결성은 통신 주체 간의 연결을 유지하지 않음으로 리소스를 아끼는 등의 이득을 취함.
    • 무상태성은 클라이언트의 정보를 서버가 유지하지 않음으로, 응답의 멱등성과 서버 scale out 의 확장성 등의 이득을 취함.

쿠키

  • 서버가 브라우저에게 세션ID 를 심어주는 저장소 이름이 "쿠키"

  • 쿠키는 웹 사이트에 접속할 때 생성되는 정보를 담은 임시 파일

  • 쿠키의 데이터 형태는 Key 와 Value로 구성되고 String 형태로 이루어져 있다.

  • 쿠키의 구성 요소

    • key(이름) : 각각의 쿠키를 구별하는 데 사용되는 이름
    • value(값) : 쿠키의 이름과 관련된 값
    • 유효시간 : 쿠키의 유지시간
    • 도메인 : 쿠키를 전송할 도메인
    • 경로 : 쿠키를 전송할 요청 경로
  • 쿠키는 서버를 대신해서 이러한 정보들을 웹 브라우저에 저장. (정확히는, 웹 브라우저를 이용하고 있는 컴퓨터에 저장)하고 사용자가 요청을 할 때 그 정보를 함께 보내서 서버가 사용자를 식별할 수 있게 해준다.

쿠키의 사용목적

  • 쿠키는 주로 아래의 세 가지 목적을 위해 사용된다.
    • 세션 관리(Session Management) : 로그인, 사용자 닉네임, 접속 시간, 장바구니 등의 서버가 알아야할 정보들을 저장한다.
    • 개인화(Personalization) : 사용자마다 다르게 그 사람에 적절한 페이지를 보여줄 수 있다.
    • 트래킹(Tracking) : 사용자의 행동과 패턴을 분석하고 기록한다.

쿠키 사용 예시

  1. ID 저장, 로그인 상태 유지
  2. 일주일간 다시 보지 않기.
  3. 최근 검색한 상품들을 광고에서 추천
  4. 쇼핑몰 장바구니 기능
  • 쿠키가 있기 때문에 여러 페이지를 이동할 때마다 로그인을 하지 않고 사용자 정보를 유지할 수 있는 것이다.
  • 쿠키가 없다면 다음 페이지로 정보를 파라미터로 넘겨줘야 한다.

HTTP 쿠키 작동방식

  • 쿠키도 결국 HTTP 통신에서 이루어지는 것이기 때문에 HTTP 의 응답과 요청에 따라 작동한다.
  • 요청을 받은 서버에서 쿠키를 클라이언트(웹 브라우저)로 보내고 클라이언트는 쿠키를 받으면 도메인 서버 이름으로 정렬된 쿠키 디렉토리에 쿠키(정보)를 저장한다.
  • 이후 클라이언트가 동일한 서버로 HTTP 요청을 보내면 저장된 쿠키도 같이 전송되며, 만약 서버에서 쿠키에 업데이트된 내용이 있으면 응답할 때 다시 업데이트된 쿠키를 보내준다.

단점

  • 방문했던 웹 사이트에 대한 정보 및 개인정보가 기록되기 때문에 사생활을 침해할 소지가 있으며, 이를 해소하기 위해서 웹 브라우저 자체에 쿠키 거부 기능이 있다.
  • 이러한 쿠키에 대한 거부가 웹 브라우저에 설정되어 있으면, 쿠키 본래의 목적인 웹 브라우저와의 연결을 지속시키는 기능을 수행할 수 없는 경우가 발생한다.
  • 서버가 가지고 있는 것이 아니라 사용자에게 저장되기 때문에, 임의로 고치거나 지울 수 있고, 가로채기도 쉬워 보안이 취약하다. 따라서 , 쿠키에는 민감하거나 중요한 정보를 담는 것은 위험하다.

세션

  • 무상태성의 단점을 보완하는것.(응답자가 요청자의 상태를 저장하는것)
  • 사용자 정보 파일을 서버에서 관리
  • 클라이언트가 Request를 보내면, 해당 서버에서 클라이언트에게 유일한 ID를 부여하는데 이것이 세션ID이다.
  • 사용자에 대한 정보를 서버에 두기 때문에 보안에 좋다. 단 사용자가 많아질수록 서버 자원을 많이 차지한다.
  • 웹 브라우저가 서버에 접속해서 브라우저를 종료할때까지 인증상태를 유지한다.
  • 아이디, 닉네임 등의 정보를 세션에 담아두면 요청이 있을 때 마다, DB에 접근할 필요가 없어서 효율적이다.

특징

  • 웹서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장
  • 웹서버에 저장되는 쿠키 (=세션쿠키)
  • 브라우저를 닫거나, 서버에서 세션을 삭제했을 때 삭제되므로, 쿠키보다 보안이 좋다.
  • 저장데이터에 제한이 없다.
  • 각 클라이언트의 고유세션ID를 부여한다.
  • 세션ID로 클라이언트를 구분하여 각 클라이언트 요구에 맞는 서비스를 제공한다.

동작순서

  1. 클라이언트 요청 (사용자가 웹사이트 접근)
  2. 서버는 접근클라이언트의 Request-Header필드인 cookie를 확인하여, 클라이언트가 해당 세션ID를 보냈는지 확인
  3. 세션ID가 존재하지 않는다면, 서버는 세션ID를 생성해 클라이언트에게 전송.
  4. 서버에서 클라이언트로 준 세션ID를 쿠키를 사용해 서버에 저장한다.
  5. 클라이언트는 재접속시, 이 쿠키를 이용하여 세션ID값을 서버에 전달한다.

비교

쿠키세션
저장위치클라이언트서버
저장형식text(string)Object
리소스클라이언트 리소스서버 리소스
용량제한도메인당 20개, 1쿠키당 4KB제한 없음
만료시점쿠키 저장시 설정알수 없음

0개의 댓글