클라이언트에서 요청(request)를 보내면 서버는 요청을 처리해서 응답(response)을 한다.
이 때 브라우저와 서버간에 데이터를 주고 받기 위한 방식으로 HTTP 프로토콜을 사용한다.
HTTP 프로토콜이란 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 상호간에 정의한 (데이터 교환 교환을 위한)규칙을 말한다.
HTTP 프로토콜은 서버에 연결하고 요청해서 응답을 받으면 연결을 끊어버리는 Connectionless(비연결지향)와 연결을 끊는 순간 통신이 끝나며 상태 정보를 유지 않는 Stateless(상태정보비유지)라는 특징을 가진다. 이러한 특징 때문에 세션과 같은 별도의 추가 정보를 관리하지 않기 때문에 이러한 추가 정보를 가지고 있어야 하는 상황에는 쿠키, 세션 등을 이용해 클라이언트에 저장해준다.
(예. 인증)
🍪 쿠키(Cookie)
쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일을 말한다. 사용자가 웹 사이트에 첫 방문 시 사용자 컴퓨터의 하드 디스크에 이 파일을 저장해두고 사용자가 해당 웹 사이트를 재 방문했을 때, 그 사이트에 사용자에 대해 알려주는 역할을 한다.
쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 참조한다.
사용자 인증이 유효한 시간을 명시할 수 있으며, 유효시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징이 있다.
세션 쿠키: 쿠키에 만료일이 포함되어 있지 않은 경우, 메모리에 저장되고 하드 디스크에 기록되지 않는다. 브라우저를 닫는 순간(서버에서 만료) 영구적으로 손실된다.
영구적 쿠키: 쿠키에 만료일이 포함되어 있는 경우, 브라우저를 종료해도 하드 디스크에 저장된다. 만료 시기가 되면 삭제된다.
Response Header에서 Set-Cookie 속성을 사용하면 클라이언트에서 쿠기를 만들 수 있으며 사용자가 따로 요청하지 않아도 브라우저가 Request 시 Request Header에 넣어 자동으로 서버에 전송함.
쿠키의 구성 요소
- 이름(각각의 쿠키를 구별하는데 사용되는 이름)
- 값(쿠키의 이름과 관련된 값)
- 유효시간(쿠키의 유지시간)
- 도메인(쿠키를 전송할 도메인)
- 경로(쿠키를 전송할 요청 경로)
쿠키의 동작 방식
1. 클라이언트가 페이지를 요청
2. 서버에서 쿠키를 생성
3. HTTP 헤더에 쿠키를 포함하여 응답
4. 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음
5. 같은 요청일 경우 HTTP 헤더에 쿠키를 함께 보냄
6. 서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 때 쿠키를 업데이트하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답함.
예시)
사이트 로그인 시 "아이디와 비밀번호를 저장하시겠습니까?"
쇼핑몰의 장바구니 기능
자동 로그인, 팝업 "오늘 더 이상 이 창을 보지 않음"
사용자 이전 스크롤링이나 뷰 설정 값 등등
단점
- 요청시 쿠키의 값을 그대로 보내므로 유출 및 조작당할 위험이 있어 보안에 취약하다.
- 쿠키에는 용량 제한이 있어 많은 정보를 담을 수 없다.
- 웹 브라우저마다 쿠키에 대한 지원 형태가 다르기 때문에 브라우저 간 공유가 불가능하다.
- 쿠키의 사이즈가 커질수록 네트워크에 부하가 심해진다.
🗒 세션(Session)
세션은 쿠키와 완전히 분리된 개념이 아니며 쿠키를 기반하고 있다. 쿠키와는 달리 세션은 사용자 정보 파일을 서버측에 저장하고 관리한다.
세션 스토리지에 세션 정보를 저장하며 쿠키를 통해 클라이언트 로그인 상태를 유지시킬 수 있지만, 정보 유출 및 위변조의 위험으로 개인정보를 HTTP로 주고 받는 것은 위험하다.
서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 종료할 때까지 인증상태를 유지한다.
서버는 클라이언트가 보낸 요청을 쿠키에 담긴 세션 ID와 세션 스토리지에 담긴 세션 ID를 대조해 인증 상태를 판단한다. 이 때 생성되는 세션 객체는 각 클라이언트마다 유니크한 값을 가진다.
접속 시간에 제한을 두어 일정 시간 응답이 없다면 정보가 유지되지 않도록 설정할 수 있다. 또한 사용자에 대한 정보를 서버에 두기 때문에 쿠키보다 보안에 좋지만, 사용자가 많아질 수록 서버 메모리를 많이 차지하게 된다. 즉, 동접자 수가 많은 웹 사이트인 경우, 서버에 과부하를 주게 되므로 성능 저하의 원인이 될 수 있다.
세션의 동작 방식
1. 클라이언트가 서버에 접속 시 세션 ID를 발급받는다.
2. 클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장해서 가지고 있는다.
3. 클라이언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 서버에 전달해서 사용한다.
4. 서버는 세션 ID를 전달받아 별다른 작업없이 세션 ID로 클라이언트 정보를 가져온다.
5. 클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답한다.
쿠키와 세션 비교 테이블
분류 | 쿠키 | 세션 |
사용자 정보 저장 위치 | 클라이언트에 파일 형태로 저장(서버 자원을 전혀 사용하지 않음) | 서버(서버의 자원을 사용) |
보안 | 클라이언트 로컬에 저장되기 때문에 변질되거나, request 도중 스니킹 위험이 있어 보안에 취약 | 쿠키를 이용해 session ID만 저장하고, 그것으로 구분해서 서버내에서 처리하기 때문에 비교적 보안성이 좋음 |
라이프 사이클 | 만료기간을 설정할 수 있으며, 파일 형태로 저장되기 때문에 브라우저 종료 후에도 남아 있을 수 있다. 또한, 만료 기간을 넉넉하게 잡아두면 쿠키 삭제 시 유지될 수도 있다. | 만료 시간을 설정할 수 없지만 브라우저가 종료되면 만료시간에 상관없이 삭제된다. |
요청 속도 | 빠름(쿠키에 정보가 있기 때문에 서버 요청 시 속도가 빠름) | 느림(세션은 정보가 서버에 있기 때문에 서버의 처리가 요구되어 비교적 느림) |
💍 토큰(Token)
토큰은 일종의 암호화된 접근 권한이다. 사용자가 인증에 성공 시 서버는 토큰을 생성해서 클라이언트로 보낸다.
JWT(Json Web Token)는 인증에 필요한 정보들을 암호화 시킨 토큰으로 세션/쿠키 방식과 유사하게 사용자는 Access Token을 HTTP 헤더에 실어 서버에 전송한다.
토큰은 임의로 생성된 비밀번호 같이 동작하며 제한된 수명을 가지고 있어 한번 만료되면 새로 생성해야 한다. (Refresh Token)
토큰의 장점
- 세션/쿠키는 별도의 저장소 관리가 필요하지만 JWT는 발급한 후 검증만 하기 때문에 추가로 저장소가 필요하지 않다.
- 확장성이 뛰어나다. 토큰을 기반으로 하는 다른 인증 시스템에 접근이 가능하다. 예를 들어 페이스북, 구글, 마이크로 소프트 로그인 등은 모두 토큰 기반으로 인증을 하는데 권한을 받을 수도 프로필을 써드파티 웹사이트에 제공하도록 허가할 수도 있다.
토큰의 단점
- 이미 발급된 JWT에 대해서는 유효기간이 만료되기 전까지 계속 사용이 가능하다. 쿠키나 세션은 악의적으로 이용된 경우, 그냥 쿠키를 삭제하면 되지만 JWT는 유효기간이 지나기 전까지 정보를 이용할 수 있다는 문제가 있다. 이러한 경우, Access Token의 유효기간을 짧게 하고 Refresh Token을 새로 발급하면 된다.
- JWT는 길이가 길기 때문에 인증이 필요한 요청이 많을 수록 서버의 자원낭비가 발생한다.
🔥 캐시(Cache)
이미지 등의 리소스 파일들의 임시 저장소. 한 번 내려받은 데이터를 저장소에 저장해두고 재사용할 수 있다.
웹 사이트 방문 시 리소스가 한번에 다운로드 되는데, 접속할 때마다 리소스를 내려받을 경우 웹성능이 떨어지므로 한번 로드된 리소스를 클라이언트에 저장해두고 재요청 시 캐시에서 로드해와서 속도를 향상시킬 수 있다.
1) 브라우저 캐시
클라이언트 애플리케이션들이 내부적으로 갖는 캐시
2) 프록시 캐시
실제 서버가 있는 곳이 아닌 네크워크 관리자에 의해 네트워크 상에 설치되는 캐시로 latency와 트래픽을 줄이는데 이용된다고 함.
3)게이트웨이 캐시
서버 관리자에 의해 설치 및 운용되는 캐시이며, 서버의 앞단에 설치되어 요청에 대한 캐시 및 효율적인 분배를 통해 서버의 응답 성능을 개선한다고 함.
* 쿠키와 캐시는 둘 다 클라이언트에 저장되는 데이터지만 목적이 다르다.
홈페이지 재접속 시 css/js 파일을 사용자 pc에 로드하여 서버를 거치지 않아도 된다.
* http는 stateless하다는 특성을 가지는데, stateless = '비' 상태 유지. 서버가 클라이언트의 정보를 계속 유지하고 있지 않다는 의미이다.
stateless한 프로토콜을 가지고 stateful한 서비스를 구현하기 위해 사용되는 것이 쿠키와 세션.
쿠키는 클라(=로컬=사용자브라우저)에 정보를 저장하고, 세션은 서버에 저장된다.
참고 - https://brunch.co.kr/@b30afb04c9f54dc/7
https://m.blog.naver.com/dmswjd93/221284561424
https://joshua1988.github.io/web-development/http-part1/
'개념 정리' 카테고리의 다른 글
[알고리즘] 시간 복잡도(Time Complexity) (0) | 2023.02.20 |
---|---|
package.json 작성하기 (0) | 2022.05.03 |
package.json과 package-lock.json 그리고 node_modules (0) | 2022.04.21 |
스택(STACK), 큐(QUEUE) (0) | 2022.04.19 |
폴리필(polyfill) (0) | 2022.02.07 |