[CS] 쿠키와 세션

fejigu·2022년 10월 15일
2

CS

목록 보기
1/3


아무래도 CS에 대한 공부가 부족한 것 같아, 이번주부터 짧지만 굵게 5주동안 동기들과 스터디를 만들어 CS 공부를 하기로 했다. 공부한 내용들은 md 파일로 작성하여 깃헙에 올리고, 팀원들과 각자 맡은 분야에 대해 발표하는 시간을 갖기로 했다. 1주차 내가 맡은 분야는 쿠키와 세션이다.


🔎 쿠키와 세션을 쓰는 이유


👉🏻쿠키와 세션은 HTTP 프로토콜의 특징이자 약점을 보완하기 위해서 사용합니다.

기본적으로 HTTP 프로토콜 환경은 "connectionless, stateless"한 특성을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인해야합니다. 이 특성을 보완하기 위해서 쿠키와 세션을 사용하게 되는 것입니다.

앞서 말했듯이 HTTP 프로토콜 환경은 Connectionless하며 Stateless한 특성을 가집니다.

먼저, Connectionless는 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징입니다. HTTP는 먼저 클라이언트가 request를 서버에 보내면, 서버는 클라이언트에게 요청에 맞는 response를 보내고 접속을 끊는 특성이 있습니다.

다음으로, stateless는 통신이 끝나면 상태를 유지하지 않는 특징입니다. 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이 있습니다.

이런 두 가지 특징을 해결하기 위해 쿠키와 세션을 사용하는 것입니다.

예시) 쿠키와 세션을 사용하지 않으면 쇼핑몰에서 옷을 구매하려고 로그인을 했음에도, 페이지를 이동할 때 마다 계속 로그인을 해야 합니다.
쿠키와 세션을 사용했을 경우, 한 번 로그인을 하면 어떠한 방식에 의해서 그 사용자에 대한 인증을 유지 할 수 있습니다.


🔎 쿠키란

👉🏻 쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일입니다.

이런 쿠키는 사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징이 있습니다.

쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 참조합니다.

클라이언트에 300개까지 쿠키저장 가능, 하나의 도메인당 20개의 값만 가질 수 있음, 하나의 쿠키값은 4KB까지 저장합니다.

Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있습니다.

쿠키는 사용자가 따로 요청하지 않아도 브라우저가 Request시에 Request Header를 넣어서 자동으로 서버에 전송합니다.

이러한 쿠키는 이름, 값, 유효기간, 도메인, 경로와 같은 구성 요소를 가지고 있습니다.


Session Cookie : 만료시간을 설정하고 메모리에만 저장되며 브라우저 종료시 해당 쿠키는 삭제된다.
Persistent Cookie : 장기간 유지되는 쿠키이며, 파일로 저장되어 브라우저 종료와 관계없이 사용할 수 있다.
Secure Cookie : HTTPS에서만 사용되며, 쿠키 정보가 암호화되어 전송된다.
Third-Party Cookie : 유입 경로를 추적하기 위해 사용되며, 광고 배너 등을 관리할 때 사용된다.

이름 (Name) : 쿠키를 구별하는데 사용
값 (Value) : 각 쿠키에 저장된 값을 의미
유효기간 (Expires) : 쿠키가 유지되는 기간을 의미
도메인 (Domain) : 쿠키가 사용되는 도메인을 의미
경로 (Path) : 쿠키를 전송할 경로를 의미


🔎 세션이란

👉🏻 세션은 일정 시간동안 같은 사용자로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술입니다.

여기서 일정 시간은 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점으로부터 웹 브라우저를 종료하여 연결을 끝내는 시점을 말하는데요.

즉, 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 합니다.

세션은 브라우저가 종료될 때까지 인증상태를 유지하지만, 메모리에 저장을 하기 때문에 브라우저가 종료되면 인증 정보가 사라진다는 특징을 지니고 있습니다.


🔎 쿠키와 세션은 비슷한 역할을 하며, 동작 원리도 비슷한데..차이는?

👉🏻 쿠키와 세션의 차이점은 저장위치, 보안, Lifecycle, 속도 이렇게 총 4가지가 있습니다.

먼저 가장 큰 차이점은 저장 위치입니다. 쿠키는 로컬에, 세션은 로컬과 서버에 저장됩니다.
때문에 쿠키는 서버의 자원을 전혀 사용하지 않으며, 세션은 서버의 자원을 사용합니다.

다음으로 보안입니다. 보안 면에서는 쿠키보다 세션이 더 우수합니다.
쿠키는 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니핑 당할 우려가 있어서 보안에 취약하지만
세션은 쿠키를 이용해서 sessionid 만 저장하고 그것으로 구분해서 서버에서 처리하기 때문에 비교적 보안성이 좋습니다.

Lifecycle의 경우, 쿠키는 브라우저를 종료해도 파일로 남아있지만, 세션은 브라우저 종료시 세션을 삭제합니다.
쿠키도 만료시간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 계속해서 정보가 남아 있을 수 있습니다.
또한 만료기간을 넉넉하게 잡아두면 쿠키삭제를 할 때 까지 유지될 수도 있습니다.
반면에 세션도 만료시간을 정할 수 있지만 브라우저가 종료되면 만료시간에 상관없이 삭제됩니다.
예를 들어, 크롬에서 다른 탭을 사용해도 세션을 공유됩니다. 다른 브라우저를 사용하게 되면 다른 세션을 사용할 수 있습니다.

마지막으로 속도의 경우, 쿠키는 파일에서 읽기 때문에 상대적으로 빠르고, 세션은 요청마다 서버에서 처리를 해야하기 때문에 비교적 느립니다.


🔎 세션을 사용하면 좋은데 왜 쿠키를 사용할까?

👉🏻 세션은 서버의 자원을 사용하기 때문에 무분별하게 만들다보면 서버의 메모리가 감당할 수 없고,속도가 느려질 수 있기 때문에 쿠키가 유리한 경우가 있습니다.


📍그래서 토큰 기반의 인증방식을 사용하는 것이 추세이다

👉🏻 이렇게 세션은 사용자의 수 만큼 서버 메모리를 차지하기 때문에 최근에는 이런 문제들을 보완한 토큰 기반의 인증방식을 사용하는 추세입니다.

그 중 JWT라는 것이 있습니다.

profile
console.log(frontendjigu( ☕️, 📱); // true

0개의 댓글