쿠키와 세션의 차이점을 알아보기 전에 먼저 쿠키와 세션이 무엇인지부터 알아보자
쿠키와 세션의 사용 이유, 배경
쿠키와 세션을 사용하는 이유는 서버와 클라이언트의 통신 프로토콜인 HTTP 의 비연결성, 비상태성이라는 특징 때문이다.
클라이언트가 서버에게 request를 보냈을 때 그 request에 맞는 reponse를 보낸 후 연결을 끊어버리고(ㅜㅠ)
서버는 클라이언트에 대한 상태 정보를 유지하지 않기 때문에 reponse를 보낸 후에는 클라이언트에 대해 알 수 없게 된다.
만약 쿠키와 세션을 사용하지 않는다면 웹사이트에 로그인을 했음에도 페이지를 이동할 때마다 계속 로그인을 해야한다.
이러한 비연결성( 요청에 대한 응답 보내고 연결 끊어버리기 ), 비상태성( 클라이언트의 정보를 유지하지 않음 ) 때문에 쿠키와 세션을 사용해서 사용자를 인증한다.
쿠키(cookie)
쿠키란?
브라우저에 key-value쌍으로 로컬에 저장되는 데이터 파일이며, 유효시간 내에서는 브라우저가 종료되어도 계속 유지된다.
쿠키의 동작방식?
1. 서버가 클라이언트로부터 요청을 받았을 때, 클라이언트에 대한 정보를 바탕으로 set-cookie 속성을 사용해 "쿠키"를 만든다
2. 서버는 클라이언트에게 해당 요청에 대한 응답을 보낼 때 응답의 Header부분에 쿠키를 담아 보낸다
(서버로부터 쿠키가 담겨 오는 곳 : response header)
3. 클라이언트가 응답을 받으면 브라우저는 쿠키를 쿠키 디렉터리에 저장 후 또 다시 서버에 요청을 할 때 사용자가 가만히 있어도 브라우저가 request header에 쿠키를 담아서 서버에 전송한다.
4. 서버는 또 다시 response에 쿠키 정보를 참조하여 응답한다.
-> 쿠키로 인해 HTTP의 비연결 상태에서도 클라이언트가(사용자가) 서버에게 자신을 "인증" 할 수 있게 된 것이다.
쿠키의 사용예시?
- 방문 사이트에서 로그인 시, "아이디와 비밀번호를 저장하시겠습니까?"
- 팝업창을 통해 "오늘 이 창을 다시 보지 않기" 체크
세션(session)
세션은 쿠키를 이용하여 구현된다. 서버가 클라이언트를 구분하기 위해 응답에 쿠키를 포함할 때 session ID를 부여하고 클라이언트는 쿠키에 session ID를 저장해둔다.
클라이언트(사용자)의 정보를 브라우저에 저장하는 쿠키와 달리 세션은 클라이언트의 정보를 서버에 저장한다.
세션의 특징
세션에는 유효기간이 있어 일정 시간 응답이 없다면 끊을 수 있고, 브라우저가 종료될 때까지 인증상태를 유지할 수 있다.
사용자 정보를 서버에 두기 때문에 쿠키에 비하면 보안이 더 좋지만 서버에 저장하는 만큼 서버에 과부하를 줄 수 있고 성능저하의 요인이 된다.
쿠키와 세션의 차이
쿠키와 세션은 비슷한 역할을 하며, 동작 원리도 비슷하다. 그 이유는 세션도 결국 쿠키를 사용하기 때문이다.
1. 사용자의 정보가 저장되는 위치
쿠키는 서버의 자원을 전혀 사용하지 않으며, 세션은 서버의 자원을 사용한다.
2. 보안
쿠키는 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니핑 당할 우려가 있어서 보안에 취약하지만
세션은 쿠키를 이용해서 session-id만 저장하고 그것으로 구분하여 서버에서 처리하기 때문에 비교적 보안성이 높다.
3. 라이프 사이클
쿠키는 브라우저를 종료해도 정보가 유지될 수 있으며 만료기간을 따로 지정해 쿠키를 삭제할 때까지 유지할 수도 있다.
세션은 만료기간을 정할 수 있긴 하지만 브라우저가 종료되면 만료기간에 상관없이 삭제된다.
4. 속도
쿠키는 정보가 클라이언트에 있기 때문에 서버에 요청 시 속도가 빠르며
세션은 정보가 서버에 있기 때문에 처리가 요구되어 비교적 속도가 느리다
Q. 세션이 보안이 더 좋은데 쿠키를 사용하는 이유는 뭘까?
A. 세션이 쿠키에 비해 보안이 높은 편이나 쿠키를 사용하는 이유는 세션은 서버에 저장되고, 서버의 자원을 사용하기에 서버 자원에 한계가 있고, 속도가 느려질 수 있기 때문에 자원관리 차원에서 쿠키를 사용하면 서버 자원의 낭비를 방지하고, 웹사이트의 속도를 높일 수 있다.
쿠키와 세션을 통한 인증(authentication)과 인가(authorization)
인증(authentication) : 사용자가 누구인지 확인하는 절차 ex) 회원가입과 로그인
인가(authorization) : 사용자가 요청하는 것에 대한 권한이 있는지를 확인하는 절차
쿠키와 세션을 통한 인증, 인가 절차
1. 클라이언트가 로그인 하면 서버는 회원정보를 대조하여 인증한다. (인증)
2. 회원(클라이언트) 정보를 세션 저장소(서버에 있음)에 생성하고 session ID를 발급한다.
3. http response header 쿠키 부분에 발급한 session ID를 담아서 보낸다.
4. 클라이언트에서는 session ID를 쿠키 저장소에 저장하고 이후에 http 요청을 보낼 때마다 쿠키에 session ID를 담아서 보낸다.
5. 서버에서 쿠키에 담겨 온 session ID에 해당하는 회원 정보를 세션 저장소에서 가져온다. (인가)
6. 회원 정보를 바탕으로 처리된 데이터를 응답 메시지에 담아서 클라이언트에 보낸다.
쿠키와 세션을 이용한 세션 기반 인증 방식의 문제점
1. 다른 악의를 가진 사용자가 session ID 탈취 가능 -> 보안에 취약
2. http 의 가장 큰 특성 중 하나인 stateless를 위배한다. stateless는 서버가 클라이언트의 상태를 저장하지 않아야 하지만 세션 저장소에 클라이언트의 상태를 저장하게 되므로 stateful 하게 된다.
해결법 : https 사용, 세션 클러스터링, 스티키 세션, 토큰 기반 인증 방식(jwt)
+쿠키와 세션, 그리고 캐시(cache)는 뭘까?
캐시(Cache)는 웹 페이지 요소를 저장하기 위한 임시 저장소이고, 쿠키/세션은 정보를 저장하기 위해 사용된다.
캐시는 웹 페이지를 빠르게 렌더링 할 수 있도록 도와주고, 쿠키/세션은 사용자의 인증을 도와준다.
- 캐시는 이미지, 비디오, 오디오, css, js파일 등 데이터나 값을 미리 복사해 놓는 리소스 파일들의 임시 저장소이다.
- 저장 공간이 작고 비용이 비싼 대신 빠른 성능을 제공한다.
- 같은 웹 페이지에 접속할 때 사용자의 PC에서 로드하므로 서버를 거치지 않아도 된다.
- 이전에 사용된 데이터가 다시 사용될 가능성이 많으면 캐시 서버에 있는 데이터를 사용한다.
- 그래서 다시 사용될 확률이 있는 데이터들이 빠르게 접근할 수 있어진다. (페이지의 로딩 속도 ↑)
- 캐시 히트(hit) : 캐시를 사용할 수 있는 경우 (ex. 이전에 왔던 요청이랑 같은 게 왔을 때)
- 캐시 미스(miss) : 캐시를 사용할 수 없는 경우 (ex. 웹서버로 처음 요청했을 때)
참고
좋은 글이 있어 참고했습니다 :)