http 프로토콜은 "connectionless, stateless"의 특징을 갖는다.
클라이언트에서 http request를 서버에 보내면 서버는 클라이언트에게 요청에 맞는 http response를 보내고 접속을 끊는 특성이 있다. 계속 연결되어 있는 상태가 아니라 필요한 말만 하고 연결을 끊는데, 이 방식을 채택하게 된 이유는 바로 "여러 클라이언트와의 접속"을 원활히 하기 위해서이다.
하지만 인터넷에서 주고받는 모든 데이터는 보내는 데 생각보다 많은 비용을 지불한다. 따라서 매번 연결을 끊어내는 방식을 보완하고자 header에 keep-alive라는 값을 추가해 timeout, max 값을 할당하는 방법이 존재한다. timeout 시간 동안 혹은 max번 만큼 connection을 재활용하기도 한다. HTTP 1.1에서는 이 값을 default로 지니고 있다.
keep-alive는 데이터를 빈번하게 주고받아야 하는 상황에서 연결비용을 줄여준다는 장점이 존재한다. 하지만 사용자가 많은 서비스에서는 연결이 늘어나서 새로운 사용자를 받아들이지 못하는 경우가 발생할 수 있다는 단점이 존재한다.
http는 통신이 끝나면 상태를 유지하지 않는 특징이 있다. 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나고 상태 정보는 서로 유지하지 않는다.
만약, 클라이언트에서 로그인 요청을 보냈고 서버에서 성공 응답을 내려주었다고 가정한다. 이때 http의 stateless라는 특징 때문에 다음 request 요청에서는 해당 user가 로그인에 성공했는지 실패했는지에 대한 정보를 얻을 수 없다. 로그인에 성공한 user만 다음 페이지로 이동할 수 있게 구현하고자 하려는 상황에서 매번 로그인 여부를 확인하는 request를 보내야 하는 상황이 발생한다.
http 프로토콜이 갖는 connectionless, statelss의 특징에 존재하는 약점을 보완하고자 등장한 것이 쿠키와 세션이다. 세션과 쿠키의 가장 큰 차이는 저장하는 장소에 있다. 쿠키는 클라이언트(브라우저)에 저장되고, 세션은 서버 측에서 저장하고 관리하는 데이터이다.
쿠키는 클라이언트(브라우저)에 저장되는 키와 값이 들어있는 작은 데이터 파일이다. 300개까지 쿠키 저장이 가능하고 하나의 도메인 당 20개의 값만 가질 수 있다. 하나의 쿠키 값은 4KB까지 저장 가능하다. 사용자가 따로 설정하지 않아도 브라우저가 request header에 쿠키를 자동으로 넣어 서버에 전송한다.
쿠키의 동작 방식으로는 다음과 같다.
1. 클라이언트가 페이지를 요청한다.
2. 서버에서 쿠키를 생성한다.
3. 서버에서 http header에 정보를 담은 쿠키를 포함시켜 응답한다.
4. 브라우저가 종료되어도 쿠키의 유효 시간이 남아있다면 클라이언트에서 보관하고 있는다.
5. 동일 사이트를 재방문하여 동일한 request가 갈 경우 이미 존재하고 있는 쿠키를 http header로 함께 보낸다.
6. 서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 http header에 포함시켜 응답한다.
쿠키에는 두 가지 종류가 있다. 하나는 세션 쿠키(session cookie), 하나는 지속 쿠키(persistent cookie)이다.
세션 쿠키는 사용자가 사이트 탐색 시에 관련한 설정들과 선호사항을 저장하는 임시 쿠키이다. 브라우저를 닫는 순간 삭제된다. non-persistent cookies 또는 temporary cookies라고 부르기도 한다. 메모리에 저장되며 디스크에는 절대 저장되지 않는다.
브라우저가 active 상태일 때 까지만 유효하게 설정하고자 한다면 유효 시간을 세팅하지 않는 session cookie를 생성한다. 온라인 뱅킹의 예시를 생각하면 이해가 빠르다. 온라인 뱅킹의 경우 사이트를 재 접속했을 때 브라우저가 유저 정보를 기억해서는 안 된다. 재 접속한 사람이 초기에 접속했던 사람과 동일한 사람이 아닐 수 있기 때문이다. 초기에 접속한 사람이 아닌 다른 사람이 초기에 접속한 사람의 유저 정보로 은행 거래라도 진행한다면 큰일이기 때문에 해당 브라우저는 active할 때에만 유저 정보를 지니고 있도록 설정되어야 한다. 이러한 경우에 사용되는 것이 바로 session cookie이다.
지속 쿠키는 유저의 정보를 디바이스에 저장한다. 디스크에 저장되며 브라우저를 닫거나 컴퓨터를 재시작하더라도 남아있다. 이전에 등록했던 정보들과 세팅, 로그인 여부 등을 저장하고 있어 이후의 접속에서 편리함(로그인을 이미 한 유저에게 재로그인을 하도록 요구하지 않는 등)을 제공한다.
지속 쿠키는 웹 서버로부터 받을 때 유효기간이 세팅되어 있다. 유효기간이 만료 되면 그때 파기된다.
구글의 개발자 도구에서 cookie를 조회하면 session cookie와 persistent cookie를 구분해볼 수 있다. persistent cookie는 하단의 왼쪽 그림과 같이 expires 컬럼에 실제 날짜 값이 저장되어 있는 것을 알 수 있다. 이 날짜가 곧 쿠키의 유효기간이고 이 기간이 지나면 지속 쿠키는 파기된다.
반면 하단의 오른쪽 그림과 같이 session cookie는 expires 컬럼에 'Session' 이라는 값이 저장되어 있다. 이 쿠키 값은 브라우저가 종료되는 즉시 사라진다.
클라이언트를 구분하기 위해 세션 ID를 부여하여 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증 상태를 유지한다. 접속 시간에 제한을 두어 일정 시간 응답이 없다면 정보가 유지되지 않게 설정이 가능하다.
사용자에 대한 정보를 서버에 두어 쿠키보다 보안에 좋지만, 사용자가 많아질수록 서버 메모리를 많이 차지하게 된다는 단점도 존재한다. 동시 접속자 수가 많은 웹 사이트의 경우 서버에 과부하룰 주어 성능 저하의 요인이 되기도 한다. 또한 세션은 정보가 서버에 있기 때문에 처리가 요구되어 쿠키보다 느린 속도를 갖는다.
세션의 동작 방식으로는 다음과 같다.
1. 클라이언트가 서버에 접속 시 세션 ID를 발급 받는다.
2. 클라이언트는 세션 ID에 대해 쿠키를 사용해 브라우저에 저장한다.
3. 클라이언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 같이 서버에 전달해서 요청한다.
4. 서버는 세션 ID를 전달받아 세션 ID로 세션에 있는 클라이언트 정보를 가져와서 사용한다.
5. 클라이언트 정보로 서버 요청을 처리하며 클라이언트에 응답한다.
쿠키는 지속 시간에 따라 persistent cookie와 session cookie로 나뉘고 이 cookie들은 전부 클라이언트(브라우저)에 저장된다. 반면 session은 쿠키를 기반으로 하고 있으나 서버 측에서 관리된다. session cookie와 session을 잘 구분하도록 한다.
[참조] https://kamang-it.tistory.com/599
[참조] https://interconnection.tistory.com/74
[참조] https://hahahoho5915.tistory.com/32
[참조] https://blog.naver.com/PostView.nhn?blogId=dlaxodud2388&logNo=221917137726
[참조] https://www.cookiepro.com/knowledge/what-is-a-persistent-cookie/
[참조] https://stackoverflow.com/questions/34870747/session-cookie-vs-persistent-cookie