포스트

[WEB] 쿠키 & 세션

0. 도입

인터넷에 검색해보면 로그인 기능을 구현하기 위해 사용자가 입력한 정보를 세션이라는 것에 저장한다고 한다.

또한 같이 등장하는 개념인 쿠키 도 있다. 쿠키 역시 입력 정보를 저장하는데 사용되지만 세션이랑 무엇이 다른것일까? 아니, 애초에 사용자의 입력을 저장해야할 이유는 무엇일까?

1. HTTP 프로토콜

쿠키와 세션에 대해 알아보기 전에 HTTP 프로토콜을 알아볼 필요가 있다.

HTTP 통신은 다음과 같은 특징들을 가지고 있다.

비연결지향(Connectionless)

클라이언트가 서버에 Request를 보냈을때, 알맞은 Response를 보낸 이후 연결을 끊는 처리방식이다.

무상태성(Stateless)

클라이언트와 첫번째 통신을 주고받아도, 이후에 이어지는 통신에선 이전 데이터를 유지하지 않는다.

이러한 특징들은 불필요한 정보들을 계속 저장하는것을 막아 자원 절약에 도움을 주지만 몇 가지 단점도 있다.

  1. 서버가 클라이언트를 인식하지 못한다. 즉 새로고침 할 때마다 다시 로그인 해야한다.

  2. 클라이언트가 실행한 행동을 저장하지 못한다. 즉 쿠X 등에서 장바구니에 물건을 담아도 나중에 알 수 없어진다.

이런 단점들을 해결하고자 하는 방법이 쿠키와 세션이다.

2. 쿠키 & 세션

2.1 쿠키(Cookie) 🍪

쿠키는 HTTP의 일종으로 서버에서 해당 사용자의 Local 에 저장하는 작은 정보 파일이다.

HTTP에서 정보를 쿠키의 형태로 클라이언트의 로컬에 저장했다가, 필요한 경우 다시 사용할 수 있다.

쿠키는 다음과 같은 특징을 갖는다.

  1. 이름, 값, 만료일, 경로 정보 로 구성되어 있다.
  2. 클라이언트에 총 300개의 쿠키를 저장할 수 있다.
  3. 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
  4. 하나의 쿠키는 4KB 까지 저장 가능하다.

쿠키는 다음과 같은 작동 방식을 갖는다.

  1. 클라이언트가 특정 행위를 한다.(여기서는 로그인이라고 가정하자.)
  2. 클라이언트의 요청을 서버가 쿠키의 형태로 만들어 HTTP 헤더에 담아 돌려준다.
    ex) Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
  3. 클라이언트는 받은 쿠키를 로컬(클라이언트의 하드)에 저장해두고, 필요시 꺼내 사용한다.
    ex) Cookie: id =a3fWa;

쿠키의 사용 예시는 다음과 같다.

  1. 방문한 기록이 있는 사이트의 검색기록, 아이디, 비밀번호 자동 입력
  2. 팝업창의 “오늘은 다시 보지 않기” 체크기록

2.2 세션(Session) ☁️

세션은 일정 시간동안 같은 클라이언트로부터 들어오는 요구를 하나의 상태로 보고, 그 상태를 유지하는 기술이다.

여기서 말하는 일정 시간이란 클라이언트가 브라우저를 통해 서버에 접속한 시점부터, 브라우저를 종료해 연결을 끝내는 시점을 말한다.

즉 브라우저가 실행되는 동안은 세션이 유지된다.

세션은 다음과 같은 특징을 갖는다.

  1. 쿠키와 달리 로컬이 아닌 서버에 저장된다.
  2. 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장한다.
  3. 브라우저를 종료하거나, 서버에서 직접 세션을 삭제해야 없어지기 때문에 보안적으로 우수하다.
  4. 데이터 저장 상한이 없다.
  5. 각 클라이언트에 고유 ID를 부여한다. 고유 ID로 클라이언트를 구분해 적절한 요구에 대응한다.

세션은 다음과 같은 작동 방식을 갖는다.

  1. 클라이언트가 페이지를 요청한다. (페이지 접근)
  2. 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인해, 해당 클라이언트가 session-id를 보냈는지 확인한다.
  3. session-id가 없다면, 서버는 session-id를 생성해 클라이언트에게 넘겨준다.
    ex) Set-Cookie: session_id=a3fWa;
  4. 클라이언트는 넘겨받은 session-id를 쿠키에 저장한다.
  5. 클라이언트는 서버에 요청 시 이 쿠키의 session-id 값을 같이 서버에 전달한다.
    ex) Cookie: session_id =a3fWa;
  6. 서버는 전달받은 session-id를 이용해 정보를 확인해 요청을 처리한 후 응답한다.

세션의 사용 예시는 다음과 같다.

  1. 화면을 이동해도 로그아웃되지 않는다.

2.3 쿠키 vs 세션 ❓

여기까지 쿠키와 세션은 상당히 유사하다는것을 알 수 있다. 세션도 결국엔 쿠키를 사용하게 된다.

둘 다 사용자 정보(및 이것저것 등)를 저장하기 위해 사용된다. 다른점이 있다면 저장 위치와 라이프사이클이 다르다.

쿠키의 경우 로컬에 저장하기 때문에 서버의 자원을 전혀 사용하지 않아 서버에 부담이 없고, 서버와 통신 과정이 불필요하기 때문에 속도 면에서 우수하다. 또한 쿠키가 언제 만료될지 라이프사이클을 지정해 줄 수 있다.

하지만 클라이언트가 직접 정보를 조작할 수 있기 때문에 보안 면에서 취약하다.

세션의 경우 서버에 저장하기 때문에 서버와 클라이언트의 통신 과정을 반드시 거쳐야 한다. 때문에 쿠키에 비해 속도 면에서 손해를 본다. 또한 사용자가 매우 많아질 경우 서버 저장공간에 부담이 될 수도 있다.

또한 라이프사이클을 지정해 줄 수도 있지만, 브라우저 종료시 자동으로 삭제된다.

하지만 클라이언트와 서버가 session-id로만 통신하기 때문에 서버를 속속들이 알고있지 않는 이상 보안 면에서 우수하다.

3 정리

사용자와 관련된 민감한 정보인 id, password 등은 반드시 session으로 처리한다.

그 이외에 어찌되도 좋을 정보들이지만 웹페이지 동작에 필요한 정보의 경우 cookie로 처리하면 좋을 것 같다.



이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.