웹의 기초중 하나인 쿠키와 세션에 대해 알아봅니다.
쿠키와 세션에 대해 알아보기전, HTTP의 특징을 알아보고 쿠키와 세션이 필요한 이유를 알아봅시다.
HTTP의 특징
HTTP 통신의 특징은 Connectionless와 Stateless라고 할 수 있습니다.
Connectionless(비 연결지향)
클라이언트에서 서버에 요청을 보내면 서버는 클라이언트에 응답을 하고 접속을 끊는 특성이 있습니다. (HTTP1.1에서 Connection
헤더에 keep-alive
라고 설정하면 컨넥션을 유지할 수 있습니다)
Stateless(상태정보유지안함)
HTTP 통신은 요청을 응답하고 접속을 끊기 때문에 클라이언트의 상태정보를 알 수 없습니다. 이를 Stateless
하다고 합니다.
만약 로그인을 하고 그 상태를 유지한 채로 웹 서비스를 제공하려면 어떻게 해야할까요? HTTP프로토콜에서 상태를 유지하기 위해 쿠키와 세션이라는 방법이 존재합니다.
쿠키
쿠키는 클라이언트 로컬에 저장되는 Key-Value
쌍의 작은 데이터 파일입니다.
구성요소
쿠키이름, 쿠키값, 만료시간, 전송할 도메인명, 전송할 경로, 보안연결여부, HttpOnly여부
동작방식
- 클라이언트가 서버에 로그인 요청을 합니다
- 서버는 클라이언트의 로그인 요청의 유효성을 확인하고(아이디와 비밀번호 검사)
응답헤더
에set-cookie: user=chrisjune
를 추가하여 응답합니다.
3. 클라이언트는 이후 서버에 요청할 때 전달받은 cookie: user=chrisjune
쿠키를 자동으로 요청헤더
에 추가하여 요청합니다. 헤더에 쿠키값을 자동으로 추가하여 주는데 이는 브라우저에서 처리해주는 작업입니다.
쿠키의 기한이 정해져 있지 않고 명시적으로 지우지 않는다면 반 영구적으로 쿠키가 남아있게 됩니다.
쿠키값 확인 방법
브라우저 개발자도구의 네트워크에서 쿠키값을 확인할 수 있지만, 가독성이 떨어지고 수정이 불가합니다. 브라우저의 쿠키관리 탭
또는 쿠키관리 플러그인
을 설치하면 쿠키를 쉽게 수정할 수 있습니다. 쿠키는 클라이언트에서 수정할 수 있기 때문에 위변조의 위험이 항상 존재합니다. 따라서 쿠키값(value)를 암호화해야 더욱 안전합니다.
- Chrome 브라우저
- EditCookie plugin
세션
브라우저가 종료되기 전까지 클라이언트의 요청을 유지하게 해주는 기술입니다.
동작방식
- 클라이언트가 서버에 로그인 요청을 합니다
- 서버는 클라이언트의 로그인 요청의 유효성을 확인하고(아이디와 비밀번호 검사) unique한 id를 sessionid라는 이름으로 저장합니다.
- 서버가 응답할 때
응답헤더
에set-cookie: sessionid:a1x2fjz
를 추가하여 응답합니다.
4. 클라이언트는 이후 서버에 요청할 때 전달받은 sessionid:a1x2fjz
쿠키를 자동으로 요청헤더
에 추가하여 요청합니다.
5. 서버에서는 요청헤더의 sessionid
값을 저장된 세션저장소에서 찾아보고 유효한지 확인후 요청을 처리하고 응답합니다.
세션의 내용은 서버에 저장되기 때문에 계속하여 늘어날 경우 서버에 부하가 발생합니다.
쿠키와 세션의 차이점
쿠키와 세션의 차이점은 총 4가지 입니다
저장위치
쿠키는 로컬에, 세션은 로컬과 서버에 저장됩니다.
보안
쿠키는 탈취와 변조가 가능하지만, 세션은 ID값만 가지고 있고 서버에도 저장이 되어있기 때문에 상대적으로 안전합니다.
Lifecycle
쿠키는 브라우저를 종료해도 파일로 남아있지만, 세션은 브라우저 종료시 세션을 삭제합니다
속도
쿠키는 파일에서 읽기 때문에 상대적으로 빠르고, 세션은 요청마다 서버에서 처리를 해야하기 때문에 비교적 느립니다.
참고링크