본문 바로가기
Dev/Web

쿠키(Cookie)와 세션(Session)

by DUSTIN KANG 2023. 12. 5.

다음 포스팅으로 로그인과 회원가입에 대해 접하기 전 쿠키와 세션에 대한 내용을 다룰 예정이다.

쿠키와 세션은 서버와 클라이언트 간의 연결을 유지하는 역할을 한다. 우리가 보통 폼을 작성해서 POST 요청하면 응답을 받고 끝나는 HTTP와 다르게 연결이 지속된다라는 특징이 있다. 그렇다면 이 쿠키와 세션에 대해 자세히 알아보자.

💡 HTTP 프로토콜의 특징
웹에서 리소스를 교환할 수 있는 통신 규약
1. 비연결성(Connectionless) : 서버가 클라이언트의 요청을 응답하면 연결이 종료된다.
2. 무상태(stateless) : 연결이 종료되면 상태 정보는 유지 되지 않는다. 

 

더보기
  쿠키 세션
저장 위치 Client Local Server
보안 클라이언트에 저장하므로 보안 취약 Session ID만 저장하고 서버에서 처리하므로 보안성 좋음
유효기간 쿠기 저장할 때 설정 가능하며 브라우저를 닫아도 계속 남아 있을 수 있다. 브라우저 종료시 삭제
속도 서버 요청 시 빠르다 서버에서 처리하므로 상대적으로 느리다.
예시 장바구니, 아이디 비밀번호 저장 로그인

쿠키(Cookie)

쿠키의 동작 방식

쿠키는 클라이언트(브라우저)에 저장되는 키와 값이 들어 있는 파일이다. 쿠키에는 이름, 값, 유효기간, 경로 등이 포함된다. 

여기서 브라우저 메모리에 저장되는 쿠키를 세션 쿠키라 하고 로컬에 저장되는 쿠키를 영구 쿠키라고 하고 한다. 세션 쿠키는 브라우저를 종료하면 쿠키가 사라지지만 영구 쿠키는 종료되어도 남는다. 그렇다고 해서 "영구" 쿠키인 것은 아니다. 유효기간이 존재한다. 하지만 이러한 쿠키는 클라이언트에 저장되고 유효기간까지 변질될 수 있는 우려가 있으며 보안에 취약한 편이다. 또는 요청을 탈취 당할 위험도 존재한다(스니핑).

 

 

  1. 웹 브라우저가 서버에 요청을 한다.
  2. 서버는 상태 유지를 위해 쿠키를 생성하여 헤더에 쿠키를 포함(`Set-Cookie`)해 전송한다.
  3. 쿠키를 받은 브라우저는 다음 요청 때 쿠키를 다시 헤더에 넣어 전송한다.
  4. 만약, 업데이트할 필요가 있다면 업데이트하여 헤더에 넣어 응답한다.

쿠키의 사용 예시

보통 쿠키는 장바구니 관리, 팝업창, 아이디 비밀번호 저장 등에서 사용된다. 또는 아래처럼, 개인화 서비스를 위해 유저의 정보를 수집하는데 사용한다. 

Stackoverflow의 Cookie

 

Django에서 쿠키 다루기

# 쿠키 설정
response.set_cookie('user_id', '123')

# 쿠키 읽기
user_id = request.COOKIES.get('user_id', 'default_value')

 


세션(Session)

세션의 동작 방식

세션은 상태를 식별하기 위해 서버측에서 관리되는 사용자 정보 파일을 의미한다. 세션 기간이 지나거나 브라우저를 닫게 되면 세션 정보는 사라진다. 서버가 Session ID와 사용자 정보를 처리하기 때문에 쿠키보다는 상대적으로 보안성이 좋다. 다만 서버에서 처리하는 비용이 있어 쿠키보다 속도면에서는 느리다

 

 

세션의 사용 예시

세션은 로그인의 상태를 유지시켜주는데 사용한다. 사용자가 로그인을 하면 서버는 세션 생성하고 세션 ID를 발급한다.

그리고 사용자에게 세션 ID를 쿠키 헤더에 담아 전송하면 사용자는 세션 ID로 서버가 식별이 가능해 로그인을 유지시킬 수 있다.

만약 세션이 없다면, 매 페이지마다 로그인을 하면서 인증을 해야하고 매번 로그인 정보를 보내면 보안에 위험이 있기 때문에 필요한 것이다. 

 

로그인할 때, 브라우저에 저장되는 세션 ID

 

위 그림에서 볼 수 있듯이, 만약 로그인한 사용자가 많아지면 DB에는 세션 정보가 많이 차지하게 될 것이다.  그러므로 동접자 수가 많으면 서버에 과부하를 주게 되므로 성능이 저하될 수 있다. 

 

Django에서 세션 다루기

# 세션 설정
request.session['user_id'] = '123'

# 세션 읽기
user_id = request.session.get('user_id', 'default_value')

 


브라우저에서 쿠키 확인하기

Safari에서 Inspect Element를 통해 쿠키를 찾아볼 수 있다.

 

 

여기서 Cookies 말고도 Local Storage와 Session Storage가 있다는 것을 확인할 수 있다.

웹 스토리지(Web Storage)

Key-Value로 이루어진 데이터로 쿠키와 다르게 서버에는 전송되지 않는 데이터 조각 모음이다.

필요한 경우에만 꺼내 사용할 수 있기 때문에 CSRF로 부터 안전한 방식이다. 웹 스토리지는 로콜 스토리지와 세션 스토리지로 나뉘게 된다.

  • 로컬 스토리지 : 브라우저를 종료한다해도 데이터가 영구적으로 저장이 된다. 주로, 자동로그인 기능에 사용된다.
  • 세션 스토리지 : 로컬 스토리지와 다르게 유효 기간이 있으며 임시적으로 필요한 데이터를 저장할 때 사용한다. 

쿠키 보안 옵션

쿠키를 안전하게 보내기 위해 쿠키를 보내는 헤더에 대한 설정 옵션이다.

  • Secure : HTTP 프로토콜을 사용하는 경우에만 브라우저가 서버에게 전송하도록 하는 옵션이다.
  • HttpOnly : 브라우저가 Javascript로 접근할 수 없도록 하는 옵션이다.
  • SameSite : 다른 도메인에서의 쿠키 전송에 관한 옵션이다.

쿠키/세션은 캐시랑은 다르다.

캐시는 서버, 브라우저 앞단에서 이미지 파일등을 저장해놓고 사용하는 것을 말한다.

한번 캐시가 저장되면 서버가 캐시 정보를 변경해도 브라우저가 참고하기 때문에 사용자 입장에서는 변경이 안된 상태로 보일 수도 있다.

이런 부분은 사용자가 캐시를 지우거나 서버에서 클라이언트에게 응답을 보낼 때 header에 캐시 만료 시간을 명시하는 방법으로 캐시를 회피할 수 있다. 

 

마치며

이번 포스팅에서는 쿠키와 세션에 대해 개념적인 부분을 알아보았다.

결론적으로 쿠키를 사용한다는 것으로 볼 수 있는 것 같다. 큰 차이점이라고 하면 저장 위치이다. 그리고 보안 면에서는 세션이 우수하고 속도면에서는 쿠키가 더 우수하다.

  • 쿠키(Cookie) : 클라이언트 쪽에 저장되는 데이터 조각을 의미하고 쿠키를 요청할 때마다 상태를 유지할 수 있다.
  • 세션(Session) : 서버 쪽에 저장되며 사용자의 상태를 유지하기 위해 사용된다. 

 


☕️ 포스팅이 도움이 되었던 자료

오늘도 저의 포스트를 읽어주셔서 감사합니다.

설명이 부족하거나 이해하기 어렵거나 잘못된 부분이 있으면 부담없이 댓글로 남겨주시면 감사하겠습니다.

 

'Web' 카테고리의 다른 글

Django에서의 CSRF, XSS  (0) 2023.12.03