쿠키(Cookie)와 세션(Session)

NSH·2022년 6월 5일
0

쿠키와 세션에 대해 알아보기 전에 HTTP의 특징에 대해서 알아보자.

1. HTTP 특징

HTTP 통신의 특징은 Connectionless(비 연결지향)Stateless(상태 정보 유지 안함) 라고 할 수 있다.

1.1 Connectionless(비 연결지향)

클라이언트에서 서버에 요청을 보내면 서버는 클라이언트에 응답을 하고 연결을 끊는 특성이 있다.

1.1.1 Connection Keep-Alive

HTTP는 TCP를 기반으로 동작한다. TCP가 전송이 끝나면 연결이 끊어지듯이 HTTP도 서로 전송이 끝나면 연결이 끊어진다. 그런데 매번 같은 주소로 요청을 할 때마다 새로 연결하고 끊어야 한다면 자원이 낭비되고 지연 시간도 발생한다.

위 문제를 방지하고자 HTTP1.1부터 Connection 헤더에 Keep-Alive를 설정하면 한 번 연결한 TCP 연결을 재사용하며 Keep-Alive 기능을 Default로 지원한다. 즉, Handshake 과정이 생략되므로 성능 향상을 기대 할 수 있다.

1.2 Stateless(상태 정보 유지 안함)

HTTP 통신은 요청을 응답하고 연결을 끊기 때문에 서버는 클라이언트의 상태 정보를 알 수 없다. 이를 stateless 라고 한다.

위 글에서 HTTP 통신은 stateless라고 설명했는데, 만약 로그인을 하고 그 상태를 유지한 채로 웹 서비스를 제공하려면 어떻게 해야할지 생각해볼 필요가 있다. 다행히 HTTP 프로토콜에서 상태를 유지하기 위해서 쿠키와 세션이라는 방법을 제공한다.

2.쿠키(Cookie)

쿠키는 어떤 웹 사이트를 방문할 경우, 그 사이트가 사용하는 서버가 클라이언트 로컬에 저장하는 key-value 쌍의 작은 데이터 파일이다. 클라이언트의 상태 정보를 저장해놓고 필요시 정보를 참조할 수 있다.

2.1 쿠키 저장

서버에서 클라이언트한테 쿠키를 저장하라고 요청할 때 Set-Cookie:키=값;옵션 을 사용한다. 만약 Set-Cookie:name=sanghoname 이라는 keysangho 라는 value 를 저장한다. 옵션도 지정해서 보낼 수 있는데 자주 쓰이는 옵션을 아래와 같다.

  • Expires : 유효 일자
  • Max-Age : 쿠키 만료 기간
    • Max-Age가 존재하면 Expires는 무시된다.
    • Max-Age, Expires를 설정하지 않으면 브라우저가 닫힐 때 삭제된다. 이런 쿠키를 세션 쿠키(session cookie) 라고 부른다.
  • HTTPOnly : 자바스크립트에서 쿠키에 접근할 수 없도록 한다. XSS를 막으려면 활성화하는 것이 좋다.
  • Domain : 도메인을 명시해서 해당 도메인에만 쿠키가 전송되게 할 수 있다.
  • Path : 패스를 명시해서 해당 패스에만 쿠키가 전송되게 할 수 있다.

2.2 쿠키 동작 순서

  1. 클라이언트가 서버에 페이지를 요쳥한다. (사용자가 웹 사이트에 접근)
  2. 웹 서버는 쿠키를 생성한다.
  3. 생성한 쿠키에 정보를 담아 HTTP 화면을 돌려줄 때, 같이 클라이언트에게 돌려준다.
  4. 받은 쿠키는 클라이언트 로컬에 저장하고, 서버에 요청할 때 요청과 함께 쿠키를 전송한다.
  5. 동일 사이트 방문 시 클라이언트 로컬에 쿠키가 있으면, 요청 페이지와 함께 쿠키를 전송한다.

2.3 쿠키 특징

  1. 클라이언트에 총 300개의 쿠키 저장이 가능하다.
  2. 하나의 도메인 당 20개의 쿠키 저장이 가능하다.
  3. 하나의 쿠키는 4KB 까지 저장 가능하다.

3. 세션(Session)

세션은 사용자 정보를 클라이언트 로컬에 저장하는 쿠키와 달리 세션은 서버 측에서 관리한다. 웹 브라우저를 통해서 웹 서버에 접속한 시점부터 웹 브라우저를 종료하여 연결을 끝내는 시점까지 유지한다.

3.1 세션 동작 순서

  1. 클라이언트가 서버에 접속 시 세션 ID를 발급 받는다.
  2. 클라어언트는 세션 ID를 쿠키를 사용해서 저장하고 가지고 있는다.
  3. 클라이언트는 서버에 요청할 때 쿠키의 세션 ID를 같이 서버에 전달하여 요청한다.
  4. 서버는 전달 받은 세션 ID로 클라이언트 정보를 가져와서 사용한다.
  5. 클라이언트 정보를 가지고 서버 요청을 처리하고 클라이언트에게 응답한다.

3.2 세션 특징

  1. 각 클라이언트마다 고유의 ID를 부여한다.
  2. 세션 ID로 클라이언트를 구분해 요청을 처리하고 응답한다.
  3. 보안은 쿠키보다 세션이 더 좋다.
  4. 사용자가 많아지면 서버의 자원을 많이 차지한다.

4. 쿠키와 세션의 차이점

  1. 쿠키는 클라이언트 로컬에 세션은 웹 서버에 저장된다.
  2. 쿠키는 설정한 만료 기간이 지날 때까지 세션은 브라우저 종료 시 삭제된다.
  3. 쿠키는 총 300개, 도메인 당 20개 로 제한되지만 세션은 서버가 허용하면 제한이 없다.
  4. 쿠키가 세션보다 속도가 빠르다.
  5. 쿠키가 세션보다 보안이 더 안좋다.

5. 결론

세션이 쿠키에 비해서 보안이 높지만 쿠키를 사용하는 이유는 세션은 서버에 저장되기 때문에 자원을 많이 차지하기 때문이다. 따라서 쿠키와 세션을 적절하게 병행하여 사용하면 자원의 낭비를 줄이고 웹 사이트의 속도를 높일 수 있다.

profile
잘 하고 싶다.

0개의 댓글