여러 사이트를 들어가서 로그인을 한 번 하면 계속 유지되는 경험을 해본적이 있을텐데 이 경우처럼 상태를 유지시켜주는 것을 의미한다.
먼저 HTTP의 특징을 알야아한다.
HTTP는 데이터를 주고 받기 위해 서버/클라이언트에서 사용되는 통신규약이다.
요 HTTP에는 비연결성과 비상태성이라는 특징이 존재하는데 간단히 말해서 서버의 자원을 절약하기 위해서 요청마다 연결과 해제를 거친다.
따라서 연결 상태가 유지되지 않고 연결이 해제되면 상태 정보가 저장되지 않게 된다.
이 때, 이 상태 정보를 유지하기 위해서 쿠키와 세션을 사용한다.
쿠키는 서버가 사용자의 웹 브라우저에 저장하는 데이터를 말하며 Key-Value 형태로 구성되고 String으로 이루어져 있다.
(정확히는 웹 브라우저가 지정한 메모리 or 하드디스크에 저장)
브라우저마다 저장되는 쿠키는 달라서 같은 로그인일지라도 브라우저가 다르면 다른 사용자로 인식한다.
한 마디로 서버를 대신해서 이런 정보들을 로컬 웹 브라우저에 저장하고 서버를 이용할 때마다 보여주는 것이다.
Set-Cookie로 담아 보내준다.Cookie를 헤더에 담아 보내준다.(즉, 최초 로그인 한 번을 하면 이후에는 로그인 대신 쿠키를 보낸다.)사용자가 같은 요청을 할 때 그 정보를 함께 헤더에 보내서 서버가 사용자를 식별할 수 있게 해준다.
또한 서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답한다.
기본적으로 session 쿠키로 진행되는데 웹 브라우저가 종료되면 같이 사라지는 쿠키를 session 쿠키라고 하고
웹 브라우저가 종료되도 살아있는 쿠키를 permanent 쿠키라고 한다.
permanent 쿠키는 브라우저의 종료와 상관 없이 설정한 만료 기한 동안살아있다.
permanent 쿠키로 사용하고 싶다면 서버에서 클라이언트로 쿠키를 만들어서 보낼 때 만료 기한정보도 쿠키에 같이 담아 보내면 된다.
로컬 웹 브라우저에서 사용자의 민감한 정보를 관리하기 때문에 임의로 고치거나 지울 수 있고, 가로채기가 쉬워 보안에 취약해진다.
이런 쿠키의 단점을 해결하기 위해 나온 것이 세션이다.
세션은 쿠키와 다르게 사용자 정보를 서버에 저장한다.
(일반적으로 서버의 메모리나 session DB에 저장 )
로그인 상태 유지시 쿠키만 사용했다면 클라이언트에서 사용자를 구별하기 위한 민감한 정보를 쿠키에 담아 보내주었겠지만 세션은 sessionID를 쿠키로 보내준다.
더 자세히 말해보면 서버에는 사용자 정보들이 session DB에 sessionID에 대한 value(Object 형태)로 저장되어 있고
클라이언트에서 sessionID는 웹 브라우저 당 1개씩 생성되어 웹 컨테이너에 저장되며 브라우저 종료시 소멸된다.
로그인한 사용자에 대해서만 sessionID 생성하는 것이 아니라 로그아웃 후 다시 로그인하면 새로운 사용자로 인식해 새로운 sessionID를 생성한다.
sessionID를 생성해 클라이언트로 응답보낼 때 헤더에 Set-Cookie로 담아 보낸다.sessionID를 Cookie로 담아 보낸다.sessionID를 받아 서버의 세션 저장소에서 사용자 정보를 비교해 같은 사용자임을 확인한다.서버의 메모리로 로딩되기 때문에 세션 정보가 많아질 경우 서버에 부담이 가게 된다.
또한 sessionID도 가로채게되면 로그인한 효과를 낼 수 있다.(하지만 브라우저 종료시 sessionID가 만료되고 실제 사용자 정보를 알아낸 것이 아니기 때문에 쿠키에 비해서는 매우 안전한 편이다.)