쿠키와 세션

Kim, Beomgoo·2022년 9월 16일
0

네트워크

목록 보기
3/3

HTTP에서 쿠키와 세션을 사용하는 이유

HTTP는 connectionless하고 stateless하다는 특징을 가진다.

Connectionless와 Stateless

사용자 인증과 같이 서버에서 지속적으로 클라이언트의 상태나 정보 등을 알아야 할때, 단점이 될 수 있는 connectionless하고 stateless한 특징을 보완하기 위해 우리는 쿠키세션을 이용한다.

쿠키(Cookie)

우리가 사이트에 접속하면, 사이트(서버)는 접속한 클라이언트의 정보가 지속적으로 필요하다고 판단되면 해당 정보를 클라이언트의 로컬(브라우저)에 파일의 형태로 저장하도록 하는데, 이 파일을 쿠키(Cookie)라고 한다.

쿠키의 특징

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

  • 만료일이 지정되어 있는 경우, 브라우저가 종료되어도 유지된다. (세션 쿠키가 아닌 경우)
  • 클라이언트에 최대 300개의 쿠키를, 이 중 하나의 도메인 당 최대 20개의 쿠키를 저장할 수 있다.
  • 하나의 쿠키는 최대 4KB의 용량을 가질 수 있다.

서버가 클라이언트에 Response를 할 때, 응답 헤더에 set-cookie를 설정하면 클라이언트(브라우저)는 설정된 쿠키를 생성하여 로컬에 저장한다.

https://www.khu.ac.kr/에 접속했을 때의 응답 헤더를 보면, Set-Cookie로 쿠키를 생성하도록 하는 것을 볼 수 있다.

쿠키의 구성

  • Name
    • 쿠키의 이름
  • Value
    • 저장된 쿠키의 값
  • Domain
    • 쿠키를 사용하는 도메인 정보. 쿠키를 전송할 도메인의 정보이기도 하다.
  • Path
    • 쿠키가 전송될 경로 정보
  • Expires / Max-Age
    • 쿠키의 만료일 또는 만료 시간
    • 만료일이 지정되어 있는 쿠키는 영구 쿠키(Persistent Cookie)이므로, 브라우저가 종료되어도 삭제되지 않는다.
    • 만료일이 지정되어 있지 않고 Session으로 표기되어 있는 쿠키는 세션 쿠키(Session Cookie)이며, 브라우저가 종료되면 세션 쿠키는 삭제된다.
    • 만료일이 지난 쿠키는 로컬에서 삭제된다.

쿠키의 종류

  • 세션 쿠키(Session Cookie) - 만료시간을 지정하지 않은 경우에 해당하며, 후술할 세션을 구현하기 위해 사용한다. 브라우저 종료 시 세션 쿠키는 삭제된다.
  • 영구 쿠키(Persistent Cookie) - 만료일이 지정된 경우, 해당 만료일까지 로컬에 파일로 남아 존재한다. 브라우저를 종료해도 영구 쿠키는 유지된다.

쿠키의 동작 예시

(주의 : 아래의 로그인을 통한 예시는 쿠키가 어떻게 쓰이는지 보여주는 것으로, 실제 적용 시 보안 위험이 존재합니다.)

  1. 클라이언트가 인증 정보를 담아 서버에 로그인 요청을 한다.
  2. 서버는 인증 정보를 확인한 뒤, 응답 헤더에 set-cookie: user=chrisjune을 추가하여 응답한다.
  3. 클라이언트는 헤더의 set-cookie에 따라 로컬에 nameuser이고 valuechrisjune인 쿠키를 저장한다.
  4. 이후 서버에 요청을 보낼 때마다 응답 헤더에 쿠키를 담아 보낸다.
  5. 서버는 쿠키를 통해 누구의 요청인지, 적절한 권한이 있는지 등 인증과 인가를 진행한 뒤 적절한 응답을 보낸다.

세션(Session)

사용자가 서버에 접속한 후 브라우저를 종료하거나, 연결을 끊을 때까지를 하나의 상태로 보고 이를 유지시키는 것을 세션이라고 한다.

세션의 특징

  • 세션은 쿠키와 다르게, 정보를 로컬이 아닌 서버에 저장하고 관리한다.
  • 쿠키를 기반으로, 고유한 세션 ID를 통해 클라이언트를 구분한다.
  • 세션을 서버의 어디에 저장할지는 서버마다 다르다. MySQL 등의 독립적인 DB에 저장할 수도 있고, Redis같은 인메모리 DB에 저장할 수도 있으며, 톰캣과 같은 WAS의 메모리에 저장할 수도 있다. 따라서 세션의 저장 데이터 제한 또한 서버마다 다르다. → 각각의 장단점은?
  • 접속한 사용자가 많아질수록 서버가 관리해야 하는 세션의 양은 늘어난다.

세션의 동작 예시

(세션 저장소는 구현에 따라 서버 내부 또는 외부에 위치해 있을 수 있다.)

  • 로그인

  • 로그인 이후 Request

쿠키와 세션의 비교

저장 위치

  • 쿠키는 로컬(브라우저)에, 세션은 서버에 저장된다.

보안성

  • 쿠키는 유지할 정보를 모두 로컬에 저장하고, Request마다 이 정보들을 header에 넣어 전달한다.
  • 따라서 변조 또는 감청(스니핑)의 위험이 존재한다. 쿠키에 ID와 비밀번호를 담아 보내는 경우…
  • 하지만 세션의 경우, 유지할 사용자의 정보는 서버가 갖고 있고,
  • 그 사용자가 누구인지는 session ID로 구분하므로 비교적 안전하다. → 세션ID가 탈취당한다면?

라이프 사이클

  • 쿠키(영구 쿠키)와 세션 모두 만료기간을 설정할 수 있다.
  • 영구 쿠키는 브라우저를 닫아도 삭제되지 않고 유지된다. 만료기간이 지나면 로컬에서 삭제된다.
  • 세션의 경우, 브라우저를 닫으면 세션 쿠키가 삭제되어 로컬에서의 세션은 삭제된다.
  • 만료 기간이 지나면 세션 정보는 서버에서 삭제된다.

병행 사용

  • 쿠키는 로컬에서 관리하며 정보를 서버에 바로 전달하므로 세션에 비해 속도가 빠르다는 장점이 있지만, 보안성이 떨어진다는 단점이 있다.
  • 세션은 보안성이라는 장점이 있지만, 세션 ID를 통해 서버에 있는 정보를 가져와야 해서 비교적 느리다는 점과, 사용자가 늘어날수록 서버가 관리해야 할 세션의 부담이 증가한다는 단점이 있다.
  • 따라서 용도에 따라 쿠키와 세션을 병행하여 사용한다.

참고자료

profile
하나에 하나를 보탠다

0개의 댓글