http의 stateless(통신이 끝나면 연결을 유지하지 않는 특징)을 보완하기 위한 기법이 쿠키와 세션이다.
웹사이트의 다양한 페이지에서 활용될 수 있도록 서버에서 일시적으로 정보를 저장한다. 유저 세션은 유저가 특정 네트워크 어플리케이션에 로그인할 때 시작되고 사용자가 프로그램에서 로그아웃하거나 시스템을 종료될 때 끝난다.
세션 값은 binary or encrypted 형태로 저장되며 서버에서만 해독decode할 수 있으므로 보다 안전하다. 유저가 시스템을 종료하거나 프로그램에서 로그아웃하면 세션 값이 자동으로 삭제되므로 값을 영구히 유지하려면 데이터베이스에 값을 저장해야 한다.
세션이 없다면, 웹페이지 내 다양한 페이지를 이동할 때마다 새로운 방문자로 간주되며 동일한 정보를 또 요구해야 한다. 이때 세션 쿠키를 활용하면 웹사이트 내 페이지 이동을 추적할 수 있다.
즉, 세션은 일정 시간 동안(웹 브라우저 접속부터 종료까지) 동일한 사용자로부터의 요청을 하나의 상태로 간주하고, 그 상태를 유지하는 기술이다.
웹 페이지 내 로그인 유지
쿠키는 유저 컴퓨터에 저장되는 아주 작은 텍스트 파일이다. 쿠키의 최대 파일 크키는 4KB이다. HTTP 쿠키, 웹 쿠키 또는 인터넷 쿠키라고도 한다. 유저가 웹 사이트를 처음 방문할 때 사이트는 쿠키 형태로 유저의 컴퓨터에 데이터 패킷을 전송한다.
쿠키에 저장된 정보는 누구나 볼 수 있는 텍스트 형식으로 클라이언트 측에 보관되므로 안전하지 않다. 필요에 따라 쿠키를 활성화하거나 비활성화할 수 있다. HTTP에서 클라이언트의 상태 정보를 PC에 저장했다가 필요시 정보를 참조하거나 재사용할 수 있다.
set-cookie라는 명령어로 여기에 데이터를 담아서 response를 주면, 웹브라우저에서 해당 데이터들을 자동으로 저장하고 있다가 - 클라이언트가 동일한 주소로 다시 request를 하게 될 때 cookie라는 이름으로 해당 데이터를 서버로 보내주게 된다.
그럼 서버는 이 데이터를 가지고 로그인 상태인지 확인한 뒤, response를 주므로 로그인 상태를 유지할 수 있다.
다만 문제는, response와 request가 모두 아스키코드로 되어 있으므로, 제3자 TCP를 확인했을 때 유저의 id/pw를 쉽게 확인할 수 있다는 문제인 것이다. 그래서 이를 보완하기 위해 나온 게 세션(session)이다.
세션은 쿠키와 동일하게 set-cookie와 cookie를 사용하지만, 동일하게 주고 받는 과정에서 암호화된 기법으로 임의의 문자를 생성해 그걸 서버에 저장하고, 그 임의의 암호화된 문자를 클라이언트와 서버가 주고 받는 방식이다. 제3자가 해당 데이터를 읽더라도 사용자의 id/pw는 서버에 저장되므로 중간에서 확인할 수 없다.
사이트 아이디, 비밀번호 저장
오늘 팝업창 다시 보지 않기 체크
쿠키는 크게 persistent cookie와 session cookie로 구분할 수 있다.
session cookie는 웹 브라우저가 종료될 때 제거된다. Expires(혹은 Max-Age)를 별도로 지정하지 않으면 session cookie로 간주되어 브라우저 종료시 제거된다.
Expires 설정이 있으면, 로컬 디스크에 저장하며, 만료기간을 지나면 삭제한다. 이 설정이 없으면 웹 브라우저 메모리에만 저장되므로 웹브라우저가 종료되면 바로 삭제되는 것이다.
HTTP 프로토콜은 Connectionless protocol이자 Stateless protocol이다. 클라이언트와 서버의 통신이 끝나는 순간 연결도 끝나며, 상태 정보도 저장되지 않기 때문이다. (물론 HTTP가 연결지향은 TCP 위에서 구현되었지만, 서버 측에선 연결 관리에 대한 비용을 줄이기 위해 비연결을 지향하며 옵션으로 keep-alive를 속성을 사용하는 정도일 뿐이다.)
결국 쿠키와 세션의 역할을 유사하다. 세션도 결국은 쿠키를 사용한다. 쿠키는 쿠키 안에 데이터가 저장되어 있어서 서버 요청시 속도가 빠르지만, 로컬에 저장되므로 안전하지 않다.
반면, 세션은 쿠키를 사용해 세션id만 저장하고 데이터는 서버에 저장한다. 세션id로만 구분해서 처리하므로 보안은 높지만, 데이터를 서버에서 가져와야 하므로 속도는 느리다.
다만, 쿠키는 서버의 자원을 사용하지 않고 세션은 서버 자원을 사용한다는 차이점이 명확하다. 쿠키는 서버 자원을 사용하지 않으므로 서버 자원 한계에서 자유롭다.
나중에 session과 cookie를 보완하기 위해 token이 등장한다.
Difference between Session and Cookies
쿠키(Cookie)와 세션(Session)의 차이 (+캐시(Cache))
Difference between Session and Cookies
What is the difference between session and cookies?