세션과 쿠키

Bummy·2023년 2월 24일
0

웹개발

목록 보기
4/7

현재 개발하는 과정 중에 사용자가 선택한 컬럼 값을 다른 페이지에서도 그대로 사용하고 싶어 해당 기능을 개발하는 업무를 진행하고 있다.
이러한 기능을 위해 세션을 사용하고 있는데 세션이 정확히 무엇인지
비슷한 개념인 쿠키랑은 어떻게 다른지 공부하고 기록을 남긴다.

Session과 Cookie를 사용하는 이유

HTTP 프로토콜의 약점을 보완하기 위해 사용하는데 먼저 HTTP 프로토콜의 특징이자 약점을 확인한다.

  1. 비연결지향
  • 클라이언트가 서버에 요청했을 때, 그 요청에 맞는 응답을 보낸 후 연결을 끊는 처리방식
  1. 상태정보 유지안함
  • 클라이언트의 상태정보를 가지지 않는 서버처리방식
  • 클라리언트의 첫번째 통신에서 데이터를 주고받았다 해도, 두번째 통신에서 이전데이터를 유지하지 않는다.

➕ 정보가 유지되지 않으면 매번 페이지 이동시 마다 로그인을 하거나 장바구니에서 상품을 선택했는데 구매페이지에서 상품의 정보가 사라지거나 하는 경우가 발생한다.

📌 즉, 클라이언트와 서버 통신시 정보를 유지하기 위한 수단으로 사용하는 것이 세션과 쿠키이다.


Session

세션이란?

  • 세션이란 웹 사이트의 여러 페이지에 걸쳐 사용되는 사용자 정보를 저장하는 방법을 의미
  • 사용자가 브라우저를 닫아 서버와의 연결를 끝내는 시점까지를 세션이라고 함

특징

  • 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장
  • 웹 서버에 저장되는 쿠키
  • 브라우저를 닫거나, 서버에서 세션을 삭제했을 때 삭제되므로, 쿠키보다 보안이 좋다.
  • 저장데이터에 제한이 없다.
  • 세션ID로 클라이언트를 구분하여 각 클라이언트의 요구에 맞는 서비스를 제공한다.

동작 순서

  1. 클라이언트 요청
  2. 서버는 접근클라이언트의 Request-Header 필드인 cookie를 확인하여, 클라이언트가 해당 세션ID를 보냈는지 확인
  3. 세션ID가 존재하지 않는다면, 서버는 세션ID를 생성해 클라이언트에게 전송
  4. 서버에서 클라이언트로 준 세션ID를 쿠키를 사용해 서버에 저장한다.
  5. 클라이언트는 재접속시, 이 쿠키를 이용하여 세션ID값을 서버에 저장한다.

Cookie

쿠키란?

웹사이트 방문시 그 사이트가 사용하고 있는 서버에서 사용자의 클라이언트에 저장하는 기록 데이터 파일
클라이언트의 상태정보를 클라이언트에 저장해두었다가 필요시 해당 정보를 참조 및 재사용한다.

특징

  • 이름, 값, 만료일, 경로정보로 구성됨
  • 클라이언트에 총 300개의 쿠키 저장 가능
  • 하나의 도메인당 20개의 쿠키를 가질 수 있다.
  • 하나의 쿠키는 4kb까지 저장 가능

동작순서

  1. 클라이언트 요청
  2. 웹서버는 쿠키생성
  3. 생성한 쿠키에 정보를 담아 http화면을 돌려줄 때 같이 클라이언트에게 넘긴다.
  4. 넘겨받은 쿠키는 클라이언트가 가지고 있다가 다시 서버에 요청시 쿠키를 함께 전송
  5. 동일 사이트 재방문시 클라이언트 pc에 해당 쿠키가 있을 경우, 요청 페이지와 함께 쿠키 전송

세션과 쿠키의 차이

구분쿠키세션
저장위치클라이언트(로컬)서버
라이프사이클(만료시점)쿠키 저장시 설정(브라우저가 종료되더라도 만료시점이 지나지 않으면 자동삭제 되지 않음)브라우저 종료시 삭제(기간 별도 지정 가능 )
보안로컬에 저장되어 탈취, 변조 위험 존재, 비교적 취약서버에 저장되므로 쿠키보다는 안전
속도빠름제공받은 세션 아이디를 이용해서 서버에서 다시 데이터를 참조해야하므로 비교적 느림

세션 사용 방법

필자는 PHP에서 세션을 사용해 PHP에 대한 방법을 적는다.
JAVA로 사용하게 되거나 공부를 할 경우 다시 업데이트 하도록 한다.

세션 시작

session_start();

➕ 세션이 이미 시작되어 있는데 해당 코드를 실행한다면 "already session ~" 식의 세션이 이미 실행되어 있다는 경고 메시지가 나온다.
그래서 isset($_SESSION)과 같은 코드를 사용하여 해당 코드를 사용했다.

세션 변수 등록

$_SESSION['column'] = "노출수";

➕ 세션 변수의 이름이 키값이 되며 등록을 해지않는 한 세션이 끝날 때까지 유효하다.

세션 변수 접근

echo $_SESSION['column'] ; //노출수

세션 등록 해지

unset($_SEESION['column']) session_unset(); //모든 세션 변수 등록 해지 session_destory(); //세션 아이디의 삭제

세션에 배열 저장하기

컬럼의 노출 유무를 세션에 저장했어야 했어서 키-벨류 형태로 저장을 하고 싶었다. 그 방법은 직렬화를 통해 해결할 수 있었는데
$data = array("노출수" : ture, "등록수" : false, "소진금액" : true);
$_SESSION['column'] = serialize($data); //배열을 직렬화
$data = unserialize($_SESSION['column']); //사용할 때는 다시 직렬화를 풀기

➕ 직렬화를 하는 과정에서 용량이 커진다는 단점이 있다.
따라서 데이터의 양이 크다면 세션을 사용하지 않고 DB를 사용하는 것이 적절하다고 안내하고 있다.


reference

0개의 댓글