HTTP 프로트콜의 특징이자 약점을 보완하기 위해서 사용한다.
기본적으로 HTTP 프로트콜 환경은 [Connectionless(비 연결성), 무상태 프로트콜(Stateless)] 한 특성을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인해야 한다.
여기서 간단하게 설명하자면
- 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끟어 버리는 특징
- HTTP는 먼저 클라이언트가 requst를 서버에 보내면, 서버는 클라이언트에게 요청에 맞는 response를 보내고 접속을 끊는 특성이 있다.
- header에 keep-alive라는 값을 주어서 커넥션을 재활용하는데 HTTP1.1에서는 이 것이 기본이다.
- HTTP가 TCP위에서 구현되었기 때문에(TCP 연결지향, UDP는 비연결지향) 네트워크 관점에서 keep-alive는 옵션으로
connectionless의 연결 비용을 줄여주는 것을 장점으로 비연결지향이라고 한다.
- 통신이 끝나면 상태를 유지 않는 특징
- 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지 않는 특성이 있다.
우리는 쿠키외 세션을 무상태 프로트콜(Stateless) 의 2가지 특징을 해경하기 위해 사용한다고 보면 된다.
기본적으로 쿠키란 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어가 있는 작은 데이터 파일이다.
쿠키는 기본적으로 key, value, domain, path, time으로 구성 되어 있으며 각각
위의 동작 방식을 보면 한가지 예제가 생각이 날 것이다.
그것은 바로 자동로그인, 장바구니, 오늘은 더이상 보지 않음(팝업)등의 것이 생각이 날 것이다.
내가 생각하는 것 보다 더 복잡 할 수 있겠지만 조금만 생각해보면
쿠키와 세션의 가장 큰 차이점은 쿠키는 클라이언트 즉 브라우저에 저장이 되는 반면 세션은 서버에 측에서 관리를 한다.
서버에서는 클라이언트를 구분하기 위해 세션ID라는 것을 부여하고 웹 브라우저가 서버에 접속하여 브라우저가 종료 될때 까지 인증상태를 유지 한다. 물론 접속 시간에 제한을 걸고 일정 기간 동안 응답이 없으면 정보가 유지되지 않게 설정이 가능하다.
사용자에 대한 정보를 서버에 두기 때문에 쿠키보다는 휠신 안전 하다만, 사용자가 많으면 많을수로 트래픽이 놓으면 높을수록 서버에 메모리를 많이 차치하게 된다. 즉 동시 접속자가 많은 웹 사이트인 경우 서버에 과부화를 주게 됩으로 성능 저하에 요인이 될 수도 있다.
클라이언트가 Request을 보내면, 해당 서버의 엔진이 클라이언트에게 유일안 ID를 부여하는데 이 ID가 세션 ID이다
쿠키외 세션은 비슷한 역활을 하고 동작원리도 비슷하다. 그 이유는 세션은 결국 쿠키를 사용하기 때문이다.
다만 가장 큰 차이점은 사용자의 정보가 저장 되는 위치 이다. 때문에 쿠키는 위에서 설명한 것처럼 서버의 자원을 전혀 사용하지 않고, 그에 비해 세션은 서버의 자원을 사용한다. 그렇게이 보안면에서는 쿠키보다 세션이 더 우수 할 수 밖에 없으며, 속도는 쿠키가 더 빠를 수 밖에 없다.
쿠키는 클라이언트의 로컬에 저장 되기 때문에 변질에 위험이 있다. 이렇게 말하면 그러면 세션도 쿠키를 사용하는데 똑같은거 아니냐고 말 질문을 하면 그건 아니다. 왜냐면 세션도 쿠키를 사용하지만 세션이 쿠키에 저장하는것은 고유 세션ID 이다. 이 ID는 서버에도 저장이 되어 있으며 만약에 변질이 된다고 하면 당연히 서버에서는 응답이 오지 않는다.
다음은 생명주기에 관한것이다. 쿠키는 만료기간이 있지만 파일로 저장이 되기 때문에 브라우저를 종료 해도 계속해서 정보가 남아 있을 수 있다. 또한 만료기간을 넉넉하게 주면 사용자가 삭제 하지 않는 이상 유지가 되게 할 수도 있다. 반면에 세션도 만료기간을 설정 할 수는 있지만 브라우저가 종료 되면 만료기간에 상관 없이 삭제가 된다. (인터넷 창이 2개가 열려 있으면 그것은 공유가 가능하다.)
사용자가 많이지면 서버에 부담이 간다는 이유도 있지만, 해당 서버가 다운되면 모든 세션의 정보가 손실 된다는 단점이딨다.
쿠키와 세션은 각각 클라이언트와 서버에 저장이 되는 반면에 캐시는 이미지나 css, js파일 등을 서버 앞 단에 저장해놓고 사용하는 것
이다.
한번 캐쉬에 저장이 되면 브라우저들이 참고 하기 때문에 서버에서 변경 사항이 있어서도 사용자는 변경되지 않게 보일 수 있다. 이를 해결 하는 방법은 캐시를 지우던가 서버에서 클라이언트로 응답을 보낼때 header에서 캐시 만료기간을 명시 해주는 방법이 있다.
나도 이 글을 쓰기 전까지는 쿠키와 세션의 차이는 단순 위치, 보안에 대해서만 알았는데 사실 중요한 것은 생명주기에 대한 것이다.