HTTP 통신의 특징은 Connectionless, stateless이다.
클라이언트에서 서버에 요청을 보내면 서버는 클라이언트에 응답하고 접속을 끊는 특성이 있다. (HTTP1.1에서 connection
헤더에 keep-alive
라고 설정하면 커넥션을 유지할 수 있다.)
HTTP 통신은 요청을 응답하고 접속을 끊기 때문에 클라이언트 상태 정보를 알 수 없다. 이를 stateless
하다고 한다.
이러한 특징 때문에 로그인 상태를 유지한 채로 웹 서비스를 제공하기 어렵다. 그래서 HTTP 프로토콜에서는 상태를 유지하기 위해 쿠키와 세션이라는 방법이 존재한다.
쿠키는 클라이언트 로컬에 저장되는 key-value
쌍의 작은 데이터 파일이다.
set-cookie: user=USERNAME
를 추가해 응답한다.cookie:user=USERNAME
쿠키를 자동으로 요청헤더에 추가해 요청한다. 헤더에 쿠키값을 자동으로 추가하여 주는데 이는 브라우저에서 처리해주는 작업이다. 쿠키 기한이 정해져 있지 않고 직접 쿠키를 제거하지 않는다면 반 영구적으로 쿠키는 남아있는다.request
를 보내면, 해당 서버 엔진이 클라이언트에게 유일한 ID를 부여하는데 이것이 세션 ID이다. 세션 ID는 클라이언트에 저장된다.sessionid
라는 이름으로 저장한다.set-cookie: sessionid:SESSION-ID
추가하여 응답한다.set-cookie: sessionid:SESSION-ID
쿠키를 자동으로 요청헤더에 추가해 요청한다.sessionid
값을 저장된 세션저장소에서 찾아보고 유효한지 확인 후 요청을 처리하고 응답한다. (ex. 로그인 처리)세션 내용은 서버에 저장되기 때문에 계속해 늘어날 경우 서버에 부하가 발생한다.
sessionid
만 저장하고 세션ID로 구분해 서버에서 처리하기 때문에 비교적 보안성이 좋다.세션은 서버의 자원을 사용하기 때문에 너무 많이 만들면 서버 메모리가 감당할 수 없다. 그래서 성능 저하가 발생할 수 있다.
캐시는 이미지나 css, js파일 등을 브라우저나 서버 앞 단에 저장하고 사용하는 것이다. 한번 캐시에 저장되면 브라우저를 참고하기 때문에 서버에서 변경 되어도 사용자는 변경되지 않은 상태로 보일 수 있다. 이런 부분은 캐시를 지워주거나 서버에서 클라이언트로 응답을 보낼 때 header
에 캐시 만료시간을 명시하는 방법을 이용하면 된다.