쿠키와 세션

kind J·2022년 12월 12일
0
post-thumbnail

소분소분 프로젝트의 로그인 기능 회고하면서 쿠키와 세션에 대한 개념을 다시 정리한다.
로그인 인증을 통한 사용자 식별을 이해하기 위해서는 쿠키와 세션에 대한 개념을 알아야한다.

로그인을 하면 브라우저와 서버가 같은 정보를 들고 있어야 하므로,
로그인을 했을 때, 서버는 누가 로그인을 했는지 프론트 서버와 브라우저에 알려줘야한다.

백엔드 서버에 이메일, 닉네임, 비밀번호 정보를 가지고 있는데, 이 정보를 통째로 브라우저에 보내면 해킹에 취약해진다.

정보를 보내는 대신 랜덤한 문자를 보낸다. 이것이 쿠키이다.

백엔드 서버는 실제적인 정보 대신 랜덤한 문자를 보내고 서버쪽은 '이 정보는 XXX 라는 쿠키와 연결 되어있다. 라는 정보를 저장한다.

서버쪽에서는 데이터를 통째로 들고있고 (세션),
프론트에는 랜덤한 문자열(쿠키)를 보내어 보안의 위협을 최소화 한다.

그런데, 서버쪽에서 사용자의 정보(세션)을 통째로 들고 있으면 너무 무거워진다.
사용자의 정보가 점점 커짐에 따라 많은 메모리를 차지한다.

그래서 나온 방법이 id(세션 id)만 들고 있는 것이다.
아이디가 'ABC'라면, DB에서 'ABC'에 대한 user 정보를 가져온다.

즉, 서버쪽에서는 메모리를 아끼기 위해서 쿠키에 세션 id 값만 매칭해 놓는다.
따라서, 서버는 쿠키랑 user id 만 들고 있는다.


쿠키

서버에서 생성하여 브라우저에 저장되는 키와 값으로 이루어진 작은 데이터 파일.

쿠키 생성 과정

  1. 사용자가 로그인 하면 서버는 HTTP 응답 헤더의 Set-Cookie에 담긴 "세션 식별자" 정보를 사용해 쿠키를 설정한다.
  2. 사용자가 동일 도메인에 접속하려고 하면 브라우저는 HTTP Cookie 헤더에 인증 정보가 담긴 고윳값을 함께 실어 서버에 요청을 보낸다.
  3. 서버는 브라우저가 보낸 요청 헤더의 세션 식별자(쿠키)를 읽어 사용자를 식별한다.

쿠키의 특징

  • 만료기간이 있는 키-값 저장소
  • 4KB 의 용량 제한이있음
  • 사용자가 따로 요청하지 않아도 브라우저가 Request시에 Request Header를 넣어서 자동으로 서버에 전송한다.

세션

세션은 쿠키를 기반하고 있지만 브라우저에 저장하는 쿠키와 달리 서버 측에서 관리한다.
서버에서는 클라이언트를 구분하기 위해 세션 ID 를 부여하고 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때 까지 인증상태를 유지한다.

세션 동작 방식

  1. 클라이언트가 서버에 접속시 세션 ID를 발급받는다.
  2. 클라이언트는 이 세션 ID와 매칭되는 쿠키를 저장하고 있는다.
  3. 클라이언트가 서버에 요청할 때 이 쿠키를 http 헤더로 전달한다.
  4. 서버는 쿠키와 매칭되는 세션 ID 를 찾고 클라이언트 정보를 가져온다.
  5. 클라이언트 정보를 가지고 서버 요청을 처리하고 클라이언트에 응답한다.

세션 특징

  • 정보를 서버에 두기 때문에 보안면에서 쿠키보다 우수
  • 사용자가 많아질수록 서버 메모리를 많이 차지함.
  • 동접자 수가 많으면 서버에 과부하를 줄 수 있다.
  • 접속시간에 제한을 두어 일정 시간 응답이 없다면 유지되지 않게 설정할 수 있다.

쿠키와 세션의 차이

  • 정보가 저장되는 위치
    쿠키는 브라우저에 저장되므로 서버의 자원을 사용하지 않는다. 세션은 서버의 자원을 사용한다.
  • 요청속도
    쿠키가 세션보다 더 빠르다. 세션은 서버처리가 필요하다.
  • 보안
    쿠키는 클라이언트에 저장되기 때문에 보완에 취약하지만, 세션은 쿠키를 이용해서 아이디만 저장하므로 보완성이 좋다.
  • 라이프사이클
    쿠키는 만료시간이 있지만 파일로 저장되므로 브라우저를 종료해도 정보가 남을 수 있다. 세션도 만료시간을 정할 수 있다. 그러나 브라우저가 종료되면 만료시간과 상관없이 삭제된다.

세션은 사용자 수 만큼 메모리를 차지하므로
이런 문제를 보완하기 위해 토큰 기반의 인증방식을 이용한다.

그것은 JTW로 다음글에 이어서 써보려한다.

profile
프론트앤드 개발자로 일하고 있는 kind J 입니다.

0개의 댓글