여러 사이트를 들어가서 로그인을 한 번 하면 계속 유지되는 경험을 해본적이 있을텐데 이 경우처럼 상태를 유지시켜주는 것을 의미한다.
먼저 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가 만료되고 실제 사용자 정보를 알아낸 것이 아니기 때문에 쿠키에 비해서는 매우 안전한 편이다.)