[개발상식] 쿠키와 세션

kysung95·2021년 5월 21일
4

개발 상식

목록 보기
8/13

안녕하세요. 김용성입니다.
웹 개발을 진행하다보면, 혹은 서비스 이용약관 등을 살펴보면 쿠키라는 단어를 많이 볼 수가 있어요.
그리고 웹 서핑을하다보면 종종 '세션이 만료되었습니다.' 라는 메시지를 볼 수 있습니다.
이 둘의 공통점은 사용자의 정보를 담고 있다는 점인데요.

혹시 이 둘의 차이점에 대해서도 잘 알고 계신가요?
오늘은 쿠키와 세션에 대해 이야기해볼까 합니다.
종종 면접에도 나오는 질문이니 알아두시면 좋습니다!

쿠키 (cookie)

혹시 오션월드에 가보셨나요?
그런 곳에 가면 내부에서 음식을 사먹는다거나, 보트를 대여한다거나 등등 소비를 할 때 손목에 팔찌를 하나 차고 그 팔찌를 통해 금액 체크를 하고 퇴장 시에 한번에 결제한다는 것을 아실겁니다.

여기서 가장 중요한 포인트는 우리가 손목에 팔찌를 차고 다닌 다는 것인데요.
제가 이런 이야기를 한 이유는 쿠키도 오션월드의 팔찌와 같은 역할을 하기 때문입니다.

만약에 팔찌가 존재하지 않는다면 매우 불편하겠죠? 지갑을 들고 들어가지 못하기 때문에 그때그때 내부에서 물건을 구매할 때, 본인의 인적사항 같은 것들을 매번 판매자들에게 제공하고 판매자들은 이러한 인적사항과 결제 금액 등을 카운터 측에 넘기게 될겁니다. 상상만해도 너무 귀찮지 않나요?

조금 더 구체적인 상황을 들어 만약 우리가 웹사이트를 이용하는데, 매번 로그인을 새로이 해야한다면? 예를 들어 네이버 홈페이지에서 로그인을 한 후 네이버 웹툰을 보려는데 로그인을 해야하고, 메일을 확인하려고 해도 로그인을 해야하고 정말 귀찮지 않나요?? 이러한 불편함을 겪지않아도 되게끔 해주는 것이 쿠키와 세션의 작동입니다.

쿠키의 개념

쿠키라는 것은 브라우저에 저장된 상태로 사용자들이 서비스를 이용할 때 쉽게 인증을 받을 수 있게 해줍니다.
우리가 평상시에 웹을 이용할 때 불편함을 느끼지 못하는 점도 이러한 쿠키 덕분이라고 볼 수 있어요.
그렇지만 브라우저에 저장되어 있기 때문에 보안에 취약하다는 문제점을 가지고 있는데요. 다른 사람이 이 쿠키를 조작할 수도 있고, 내가 직접 고칠 수도 있기 때문에 너무 중요한 정보는 쿠키에 실어놓지 않아요.

다음과 같이 설명할 수 있어요.

쿠키는 웹 사이트에 접속할 때 생성되는 정보를 담은 임시 파일입니다.
서버가 사용자의 웹 브라우저에 저장하는 데이터를 말하죠.
데이터 형태는 Key 와 Value로 구성되고 String 형태로 이루어져 있습니다.

쿠키의 동작 방식

쿠키의 동작 방식은 다음과 같습니다.

1, 클라이언트가 페이지를 요청합니다.
2, 서버에서 세션 ID 등을 포함한 쿠키를 생성합니다.
3, HTTP 헤더에 쿠키를 포함 시켜 response를 클라이언트 측에 보내줍니다.
4, 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있습니다.
5, 같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냅니다.
6, 서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답합니다.

쿠키의 사용 목적

  • 세션 관리(Session Management) 로그인 상태, 사용자 닉네임, 접속 시간, 장바구니 등의 서버가 알아야할 정보들을 저장합니다. (정보들을 보면 알겠지만 유출되거나 탈취당한다해도 critical 한 이슈가 발생하는 정보들은 아니예요.)

  • 개인화(Personalization) 사용자마다 다르게 그 사람에 적절한 페이지를 보여줄 수 있습니다. (이러한 점들로 인해서 여러분들이 인스타그램을 할때 평소 관심있는 분야의 광고들을 쉽게 접할 수 있는 것이죠.)

  • 트래킹(Tracking) 사용자의 행동과 패턴을 분석하고 기록합니다.

여기까지 살펴보니 어떤가요?
민감하거나 중요한 정보까지 쿠키에 저장하는 것은 굉장히 꺼려지는 문제죠.
쿠키에 있는 정보들은 내가 직접 고칠 수 있다고 했는데 예를들어 오션월드 내부에서 결제한 정보들이 팔찌에 담겨져 있고, 그 팔찌에 들어있는 데이터를 사용자가 고칠 수 있다고 가정한다면? 양심이 없는 사람들이 결제내역을 조작하곤 하겠죠?
그렇기에 취약해질 시에 위험성을 가진 정보들은 오션월드 측에서 관리를 해야할겁니다.
이것과 같은 개념이 바로 세션이죠.

세션 (session)

위에서 말한 것처럼 브라우저에 저장하기 곤란한 정보들을 서버 측에서 가지고 있는 것을 바로 세션이라고 합니다.

세션은 쿠키를 기반하고 있지만 쿠키는 브라우저(Client)에서 보관하는 것이고, 세션은 서버에서 가지고 있는 것이죠.
세션을 사용하는 사이트에 접속하면 서버에서는 사용자를 구분하기위한 세션 ID를 브라우저에 보내서 사용자의 브라우저 쿠키에 저장을 합니다. 사용자의 중요한 정보들은 서버의 데이터베이스에 저장되어 있고, 서버는 앞서 쿠키에 저장된 key를 가지고 사용자들을 인식하는 것입니다.

동작 방식

1, 클라이언트가 서버에 접속 시 세션 ID를 발급받습니다.
2, 클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 가지고 있습니다.
3, 클라리언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 서버에 전달해서 사용합니다.
4, 서버는 세션 ID를 전달 받아서 별다른 작업없이 세션 ID로 세션에 있는 클라이언트 정보를 가져옵니다.
5, 클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답합니다.

세션의 특징

  • 각 클라이언트에게 고유 ID를 부여합니다.
  • 세션 ID로 클라이언트를 구분해서 클라이언트의 요구에 맞는 서비스를 제공
  • 보안 면에서 쿠키보다 우수합니다. (취약한 정보는 세션에!)
  • 사용자가 많아질수록 서버 메모리를 많이 차지하게 됩니다.

정리

이제 쿠키와 세션에 대해 어느정도 이해가 되셨나요?
한마디로 설명하자면

쿠키는 로그인창의 아이디를 자동완성하거나 쇼핑몰 사이트에서 물건을 장바구니에 담는 등, 사용자의 편의를 위하 되, 조작되거나 가로채이더라도 큰 일이 나지 않을만한 정보들을 브라우저에서 저장하는 데에 사용되고, 누군가에게 노출되어서는 안되는 그런 정보들은 세션으로 서버 안에서 다루어지는 것입니다.

🙌 마무리

웹 개발자는 서비스를 구축할 때 어떠한 정보를 쿠키에 저장할지 세션에 저장할지 적절한 판단을 내릴 수 있어야 합니다. 쿠키에 취약한 정보를 넣어서는 안되지만 세션에만 너무 많은 정보를 담아놓을 경우 서버 과부하가 걸릴 수도 있기 때문이죠.

이러한 cookie와 session based Auth의 문제점으로 인해 나온 것이 바로 Token based Auth입니다.
JWT에 대해서 다들 들어보셨죠? 향후에 Token based Auth에 대해서도 포스팅 하도록 하겠습니다.

읽어주셔서 감사합니다. 내일 또 재미있는 포스팅으로 찾아뵙도록 하겠습니다:)

profile
김용성입니다.

0개의 댓글