쿠키와 세션의 필요성
쿠키와 세션일 왜 필요할까? 에 대해 묻는다면 아마 HTTP의 특징 때문일 것이다.
HTTP에는
서버가 응답을 완료하면 연결이 끊어버리는 성질이 있는 비연결성(Connetionless)
요청에 답하는 동시에 연결을 끊고 통신을 종료하기 때문에 상태를 저장하지 않는다는 무상태성(Stateless)
이라는 큰 특징이 있는데
자주 사용하는 웹사이트에 들어갈 때마다 매번 로그인해야 한다던가 똑같은 팝업창이 매번 나온다던가 하는 등의
번거로움을 줄이기 위해 쿠키(Cookie) 와 세션(Session)이 등장했다.
쿠키(Cookie) 란?
크롬, 사파리 같은 브라우저에 저장되는 키와 값이 들어있는 작은 데이터 파일이다.
쿠키는 클라이언트의 상태 정보를 로컬(브라우저)에 저장했다가 참조하거나 재사용 할 수 있다.
대신 저장 용량에 제한이 있는데,
- 클라이언트에 300개 까지의 쿠키 저장 가능
- 하나의 도메인 당 20개 값 가질 수 있음.
- 하나의 쿠키 값은 4KB (=4096byte) 까지 저장 가능
쿠키의 구성요소로는 아래와 같다.
- 이름
- 값
- 만료시간
- 도메인 이름
- 유효시간
- 경로
쿠키의 동작 방식으로는 아래와 같다.
- 클라이언트가 페이지를 요청
- 서버에서 쿠키 생성
- HTTP 헤더에 쿠키를 포함시켜 응답
여기서 사용하는 쿠키는 세션 쿠키로, 로그인 상태에서 웹브라우저가 종료되지 않은 상태라면 계속 유지 - 서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 때,
쿠키를 업데이트 하여 변경된 쿠키를 http헤더에 포함시켜 응답
쿠키의 사용 예시로는 아래와 같다.
- 사이트 로그인 시 '아이디와 비밀번호를 저장하시겠습니까?'
- 쇼핑몰 장바구니 기능
- 자동로그인
- 팝업 창에서 '오늘 더 이상 이 창을 보지 않음'
- 검색내역
하지만 쿠키에는 보안이라는 문제점이 있는데,
쿠키는 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니핑 당할 우려가 있어 보안에 취약하다.
쿠키에 사용자의 주민번호 같은 민감한 정보를 그대로 담아 HTTP요청을 보낸다면 중간에 스니핑을 당할 위험이 있다.
세션(Session) 이란?
일정 기간 동안 같은 클라이언트로 부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술이다.
쿠키를 기반으로 하고 잇지만 서버 측에서 관리한다는 점에서 차이가 있다.
서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여한 후,
웹브라우저가 서버에 접속해서 종료할 때 까지 인증상태를 유지한다.
만약 일정 시간이 지나면 정보가 유지되지 않도록 하고 싶다면 접속 시간에 제한을 두어 설정 가능하다.
세션의 동작방식은 아래와 같다.
- 클라이언트가 서버에 접속 시 세션ID를 발급 받음
- 클라이언트는 세션ID에 대해 쿠키를 저장하여 가지고 있음
- 클라이언트는 서버에 요청할 때 이 쿠키의 세션ID를 같이 서버에 전달해서 요청
- 서버는 해당 세션ID로 세션에 있는 클라이언트 정보를 가져와 사용
- 클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답
세션의 특징은 아래와 같다.
- 각 클라이언트에게 고유ID를 부여
- 세션ID로 클라이언트를 구분하여 클라이언트의 요구에 맞는 서비스를 제공
- 보안 면에서 쿠키보다 우수
→ 세션ID만 저장해 그것으로 구분하여 서버에서 처리하기 때문 (사용자에 대한 정보를 서버에 저장) - 사용자가 많아질 수록 서버 메모리를 많이 차지함
→ 세션ID를 서버에 저장하기 때문에 사용자가 많아지면 과부하를 주어 성능저하의 요인이 됨 - 정보가 서버에 있기 때문에 처리가 요구되어 쿠키에 비해 속도가 느림
세션의 사용 예시로는 아래와 같다.
- 로그인 같이 보안상 중요한 작업을 수행 할 때
쿠키와 세션의 차이
차이를 정리해보면 아래와 같다.
쿠키 | 세션 | |
저장위치 | 클라이언트 | 서버 |
속도 | (비교적) 빠름 | (비교적) 느림 |
보안 | 취약 | 좋음 |
라이프사이클 | 브라우저를 종료해도 정보가 남아있을 수 있음 |
만료시간이 남았어도 브라우저가 종료되면 상관없이 삭제 |
쿠키를 사용하는 이유
보안상 좋은 세션을 사용하면 되지 않을까. 라고 생각할 수 있겠지만,세션은 서버의 자원을 사용하기 때문에 무분별하게 만들다보면서버의 메모리가 감당할 수 없어질 수 있고 속도 저하로 이어질 수 있다.서버의 자원 낭비를 방지하며 웹 사이트의 속도를 높이기 위해
이러한 자원관리 차원에서 쿠키와 세션을 적절한 요소 및 기능에 따라 병행하여 사용해야 한다.
이처럼 세션은 사용자의 수 만큼 서버 메모리를 차지하기 때문에
최근에는 이를 보완하기 위해 토큰 기반의 인증방식을 사용하는 추세이다.
그 중에서는
사용자 인증에 필요한 정보를 토큰 자체에 담고 있는 JWT(JSON Web Token)가 대표적이다.
'CS공부' 카테고리의 다른 글
WS(Web Server)와 WAS(Web Application Server) 차이 (0) | 2023.08.18 |
---|---|
JWT(JSON Web Token) 이란? (0) | 2023.07.24 |
동기와 비동기 / 블록과 논-블록 (0) | 2023.07.20 |
[HTTP] HTTP 메서드 및 상태코드 (0) | 2023.07.14 |
[HTTP] HTTP의 개념 및 진화 (0) | 2023.07.13 |