HTTP 프로토콜의 특징으로 비연결성(Connectionless)과 무상태성(Stateless)이다. 즉, 서버와 클라이언트간의 통신할때 상태를 저장하지 않으며, 서버의 자원을 절약하기 위해 요청마다 연결과 해재를 반복한다.
HTTP 무상태성(Stateless)
stateful
의 반대되는 개념. 이전 상태를 보존하지 않는다.HTTP 비연결성 (Connectionless)
클라이언트 요청에 대해 서버가 응답을 마치면 맺었던 TCP/IP
연결을 끊는다.
이를 통해, 서버의 자원을 효율적으로 관리해 수많은 클라이언트 요청에도 대응한다.
(안그러면 리소스는 돼지처럼 불어남)
최근에는 Keep Alive
옵션을 통해 일정 기간동안 클라이언트와 Connection을 유지하는 방식으로 통신이 가능하다.
이 두가지 특징으로, 서버의 자원은 많이 절약할 수 있지만 같은 사용자가 매번 요청을 함에도 새로운 사용자로 인식하는 문제가 있다. 예를 들어, 로그인을 구현했다고 가정하면 HTTP는 로그인한 사용자의 정보를 저장하지 않아 새로고침 시 매번 로그인을 해줘야한다. 한번 주고 받으면 그걸로 끝!! 기억은 리셋된다.
이러한 장점이자 단점인 특성을 보완하기 위해, Cookie
와 HTML5에 등장한 Web Storage
라는 것을 알아보자.
바로 본론부터 들어가면
Cookie
는 Name
=
Value
형식으로된 구조를 가진다. 서버가 클라이언트(브라우저) 에 제공하는 작은 텍스트 데이터이며, 방문자의 물리적인 저장소(HDD, SSD)와 브라우저에 저장된다.
만약 사용자가 어떤 웹 페이지에서 로그인을 한다고 가정하면,
사용자는 이메일(혹은 ID) 비밀번호를 입력한 뒤 POST
요청으로 로그인을 한다.
서버는 사용자의 이메일(혹은 ID)와 비밀번호를 검증한다.
서버는 사용자의 다양한 정보를 서버 내에 세션이나 Cookie
에 저장하고,set-cookie
헤더를 설정하여 응답과 함께 클라이언트(브라우저)에게 전송한다.
서버로 부터 받은 쿠키를 브라우저에 저장된다.
response
HTTP/1.1 200 I+OK
Content-type: text/html
Set-Cookie: <name>=
/* Content */
이후로 사용자의 요청에 따라 페이지내의 컨텐츠에 접근할 인증 수단으로 사용되거나
쇼핑몰의 장바구니 기능, 자동로그인 등 다양한 기능에 사용된다.
쉽게 요약하자면, 대학교에서 발급해주는 학생증이라고 보면된고, 회사에선 사원증이라 생각하면 된다.
4kb
를 넘지 말아야한다.connectionless
, stateless
특성을 보안한 개념TIP
XSS
: Cross Site Scripting : 일반 사용자가 웹 사이트에 스크립트를 삽입하여 공격하는 방법
CSRF
: Cross Site Request Forgery : 웹사이트의 취약점 공격방법중 하나이며, 사용자가 위조된 스크립트가 삽입된 페이지를 열게되면 사용자의 의지와는 상관 없이 공격자의 마음대로 다양한 공격을 수행하는 공격 방법
name
: 각각의 쿠키를 구별하는 데 사용되는 이름.
value
: 쿠키의 이름과 관련된 값.
Expires
: 쿠키의 만료 시간 혹은 날짜로 만료시 쿠키가 삭제된다.
Domain
: 쿠키가 사용되는 도메인을 지정.
Path
: 쿠키가 반환할 경로를 결정한다.
Secure
: 웹페이지가 HTTPS 프로토콜을 사용할 때만 전송한다.
HttpOnly
: 일명 XSS(Cross Site Scripting)
공격을 완화하기위한 옵션이다.
SameSite
: 사이트간 요청 위조 공격에 대한 보호기능을 제공한다. 2가지 세부 옵션이 제공된다.
Strict
(default 값), Lax
(Option)
내 경우 nodejs
,express
환경에서 작성하였다. cookie-parser
라이브러리를 활용했는데... 요청된 쿠키를 쉽게 추출할 수 있는 편리한 라이브러리이다.
res.cookie('test_cookie',뭔가 중요한 정보, {
expires: 기간, //또는 maxAge
httpOnly: true, // or false
path: '/shoppingbox',
secure: true, // or false
domain: 'mydomain.link',
signed: true // false
})
쿠키를 지우는 방법은 다음과 같다.
예를 들면 로그아웃이라고 가정해보자. 간단한 명령어로 쿠키를 날려버리면 된다.
res
.clearCookie("test_cookie")
.redirect("/");
기존 쿠키는 항상 HTTP 요청시 헤더에 담겨 전송하는 방식이기 때문에 요청이 많을 수록 쿠키의 전송 횟수가 늘어나며, 웹 서비스 성능에 영향을 줄 수 있다. 또한 4kb
의 용량 제한과 암호화 되지 않은 상태로 사용하기 때문에 보안또한 취약하다.
이러한 단점을 개선한 HTML5
에 등장한 Web Storage를 알아봐야한다.
5MB
Web Storage는 당연히 브라우저 상에 저장하니 클라이언트에서 구현해야한다.
MDN
에서 제공하는 기본 사용법인데.. 다음과 같다.
window.localStorage.colorSetting = '#a4509b';
window.localStorage['colorSetting'] = '#a4509b';
window.localStorage.setItem('colorSetting', '#a4509b');
더 깔끔한 방법은 .setItem()
이런 방법이 나을 거 같다.
sessionStorage
와 localStorage
는 사용법이 같으니 하나만 참고해서 자세히 알아보자.
setItme('key', 'value')
: Key
와 Value
를 추가한다.window.localStorage.setItem('colorSetting', '#a4509b');
배열이나 객체를 저장하려면 문자열로 변경해야하는데 다음과같다.
const person = {
name: "나는 사람",
location: "어딘가",
}
window.localStorage.setItem('user', JSON.stringify(person));
getItem('key')
: 해당 키에 담긴 값을 불러온다.JSON.parse(window.localStorage.getItem('colorSetting'));
removeItem('key')
: 해당 키를 찾아 삭제한다.window.localStorage.removeItem('user');
clear()
: 존재하는 모든 항목을 삭제한다.window.localStorage.clear();
key('key')
: 키 이름을 검색한다. let anotherKey = window.localStorage.key('keyname');
주로 키를 반복해야하는 상황에서 유용하다고 한다.
하.. 어지럽다. 다음은 Session과 Cookie가 어떤점이 차이가 있는지 알아보려한다.