Cookie와 Session
Cookie와 Session을 사용하는 이유
- HTTP 프로토콜의 특징이자 약점인 비연결지향(Connectionless)와 상태정보유지안함(Stateless) 보완하기 위해서 사용합니다.
- 비연결지향(Connectionless) : 클라이언트가 Request를 서버에 보내면 서버는 클라이언트에게 요청에 맞는 Response를 보내고 접속을 끊습니다.
- 상태정보유지안함(Stateless) : 연결을 끊는 순간, 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성
Cookie
- 정보를 유지할 수 없는 Connectionless, Stateless의 성격을 가진 HTTP 프로토콜의 단점을 해결하기 위해 도입됨
- 웹 서버가 브라우저에게 지시하여 사용자의 로컬 컴퓨터의 파일 또는 메모리에 저장하는
Key-Value
쌍의 작은 데이터 파일 - 파일에 담긴 정보는 인터넷 사용자가 같은 웹 사이트를 방문할 때마다 읽히고 수시로 새로운 정보로 바뀔 수 있습니다.
- Cookie에는 이름, 값, 만료 날짜(쿠키 저장 기간), 경로 정보 등이 들어있습니다.
- Cookie의 구성 요소
- 쿠키이름, 쿠키값, 만료기간, 전송할 도메인명, 전송할 경로, 보안 연결 여부, HttpOnly 여부
- Cookie값 확인 방법
- 브라우저 개발자 도구의 네트워크에서 쿠키값을 확인할 수 있지만, 가독성이 떨어지고 수정이 불가능합니다.
브라우저 쿠키관리 탭
또는쿠키관리 플러그인
을 설치하면 쿠키를 쉽게 수정할 수 있습니다.- 이처럼 Cookie는 클라이언트에서 수정할 수 있기 때문에 위변조의 위험이 항상 존재합니다. 따라서 쿠키값(Value)를 암호화해야 더욱 안전합니다.
- Cookie 절차
- 브라우저에서 웹 페이지 접속
- 클라이언트가 요청한 웹 페이지를 받으면서 Cookie를 클라이언트 로컬(하드)에 저장
- 클라이언트가 재요청시 웹 페이지 요청과 함께 Cookie 값도 전송
- 지속적으로 로그인 정보를 가지고 있는 것처럼 사용
- Cookie의 종류
- Session Cookie : 보통 만료 시간을 설정하고 메모리에만 저장되며 브라우저 종료시 Cookie를 삭제
- Persistent Cookie : 장기간 유지되는 Cookie, 파일로 저장되어 브라우저 종료와 관계없이 사용
- Secure Cookie : HTTPS에서만 사용, 쿠키 정보가 암호화되어 전송
- Third-Party Cookie : 방문한 도메인과 다른 도메인의 Cookie, 보통 광고 배너 등을 관리할 때 유입 경로를 추적하기 위해 사용
- Cookie 사용 사례
- 자동 로그인
- 팝업에서 '오늘 더 이상 이 창을 보지 않음' 체크
- 쇼핑몰의 장바구니
- Cookie의 단점
- Cookie에 대한 정보를 매 헤더(Http Header)에 추가하여 보내기 때문에 상당한 트래픽을 발생시킴 (하지만 도메인 설정을 통해 지정한 도메인으로 요청할 때에만 쿠키값이 제공되도록 할 수도 있습니다.)
- 결제 정보 등을 Cookie에 저장했을 때, Cookie가 유출되면 보안에 대한 문제점도 발생할 수 있습니다.
Session
- Cookie의 트래픽 문제와 Cookie를 변경하는 보안적 이슈를 해결하기 위해 등장
- 브라우저가 종료되기 전까지 클라이언트의 요청을 유지하게 해주는 기술입니다.
- HTTP Session id를 식별자로 구별하여 데이터를 사용자의 브라우저에 쿠키 형태가 아닌 접속한 서버 DB에 정보를 저장
- Session id : 웹 서버에 클라이언트에 대한 정보를 저장하고 클라이언트에게는 클라이언트를 구분할 수 있는 ID를 부여하는데 이것을 Session id라고 함
- 클라이언트는 HTTP Session id를 Cookie로 메모리 저장된 형태로 가지고 있습니다.
- 메모리에 저장하기 때문에 브라우저가 종료되면 사라지게 됩니다.
- Session 사용 사례
- 로그인 정보 유지
- Session 절차
- 클라이언트가 서버에 Resource를 요청합니다.
- 서버에서는 HTTP Request를 통해 Cookie에서 Session id를 확인한 후, 없으면 Set-Cookie를 통해 새로 발행한 Session id를 보냅니다.
- 클라이언트는 HTTP Request 헤더에 Session id를 포함하여 원하는 Resource를 요청합니다.
- 서버는 Session id를 통해 해당 Session을 찾아 클라이언트 상태 정보를 유지하며 적절한 응답을 합니다.
Cookie VS Session
- Cookie와 Session의 차이는 여러 관점에서 해석해볼 수 있습니다,
- 저장 위치
Cookie는 클라이언트에 파일로 저장되며, Session은 서버 DB에 저장됩니다.
- 보안
Cookie는 클라이언트 로컬에 저장되기 때문에 보안에 취약하지만, Session은 Cookie를 이용해서 Session id만 저장하고 그것으로 구분하여 서버에서 처리하기 때문에 비교적 보안성이 좋습니다. - 라이프 사이클(Life Cycle)
Cookie는 파일로 저장되기 때문에 브라우저를 종료해도 계속해서 정보가 남아있을 수 있습니다. 또한, 만료 기간을 넉넉하게 잡아두면 '쿠키 삭제'를 할 때까지 유지될 수도 있습니다. 반면에, Session도 만료 기간을 정할 수 있지만 브라우저가 종료되면 만료 기간에 상관없이 삭제됩니다. - 속도
Cookie는 로컬에 정보가 있기 때문에 서버에 요청시 속도가 빠르지만, Session은 정보가 서버 DB에 있기 때문에 처리가 요구되어 비교적 느린 속도를 냅니다.
Session을 주로 사용하면 좋은데 왜 Cookie를 사용할까?
Session은 서버의 자원을 사용하기 때문에 무분별하게 만들다보면 서버의 메모리가 감당할 수 없어질 수가 있고, 속도가 느려질 수 있기 때문에