# 쿠키와 세션, 로컬 스토리지
쿠키와 세션은 왜 쓸까? HTTP 프로토콜의 특징을 생각해보자. HTTP 프로토콜은 connectionless, stateless한 특징을 갖고 있다.
connectionless: 클라이언트가 서버에게 request를 보내고, 서버는 클라이언트에게 response를 하면 접속을 끊는다. 요청에 대한 응답을 했기 때문이다. stateless: 클라이언트와 서버의 통신이 끝나면 연결된 상태가 끝난다. 서버가 더이상 클라이언트에 대한 정보를 갖고 있지 않는다.
따라서 계속 유저 인증을 유지하기 위해 쿠키와 세션을 사용한다.
# 쿠키
제목 | 내용 |
---|---|
정의 | 클라이언트인 웹 브라우저 로컬에 키-값 형태로 저장하는 작은 데이터 파일 |
만료 시점 | 만료 시점을 명시 가능. 브라우저가 종료되더라도 유효시간이 남아있으면 유지(persistent cookies) |
저장 위치 | 클라이언트에 파일로 저장 |
용량 제한 | 대략 4KB까지 데이터 저장. 한 도메인 당 20개, 모든 도메인에 대해 300개 제한 (쿠키는 모든 request와 response에 대해 header에 들어가게 되므로 용량 제한이 필요) |
사용 사례 | 오늘 하루 열지 않음 팝업, 장바구니 |
- HTTP 통신을 할 때마다 매번 서버에 전송되므로 크기가 클 경우에는 서버에 부담이 될 수 있음
- samesite 속성이 strict가 아닐 경우 다른 도메인에서 요청할 때에도 자동 전송되는 위험이 있음 (CSRF 취약)
쿠키의 단점을 보완해서 HTML5에서 웹스토리지라는 기술이 만들어짐. 웹 스토리지에는 로컬 스토리지, 세션 스토리지가 있다.
# 웹 스토리지
- 쿠키와 달리 개수와 용량의 제한이 없고, 서버에 매번 전송되지 않으므로 서버에 부담이 가지 않는다. (명시적으로만 전송 가능)
- 필요한 경우에만 꺼내 쓰는 것이므로 자동 전송의 위험이 없다. 다른 도메인에서 요청하는 경웨 꺼내쓰고 싶어도 도메인 단위로 접근이 제한되는 특성 때문에 값을 꺼내 쓸 수 없다.
- HTML5를 지원하지 않는 브라우저에서는 사용할 수 없다.
- 세션과 로컬스토리지 둘 다 window 객체의 프로퍼티로 존재하고 같은 storage 객체를 상속받기 때문에 동일한 메소드를 갖는다.
세션과 로컬스토리지의 주요한 차이점은 영구성이다. 지속적으로 필요한 데이터는 로컬스토리지에 저장하고, 잠깐동안 필요한 정보는 세션 스토리지에 저장한다.
# 세션
제목 | 내용 |
---|---|
정의 | 일정 시간 동안 같은 사용자, 브라우저로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지하는 기술 |
만료 시점 | 브라우저가 종료될 때까지 유지 |
저장 위치 | 서버에 저장 |
용량 제한 | 정해진 용량 제한은 없으나 서버 메모리에 저장하기 때문에 많아질 경우 성능 저하 |
사용 사례 | 로그인 상태 유지 |
- 쿠키와 달리 탭/윈도우 단위로 세션 스토리지가 생성된다. 즉 window 객체와 동일한 유효 범위 및 생존 기간을 갖고, 탭/윈도우를 닫을 시 데이터가 삭제된다. 또한 동일한 탭/윈도우라도 다른 도메인이라면 또 다른 세션스토리지가 생성된다.
- 서로 다른 세션 스토리지는 서로 영향을 주지 않고 독립적으로 동작한다.
# 로컬스토리지
- 브라우저에 반영구적으로 데이터를 저장하며, 브라우저를 종료해도 데이터가 유지된다.
- 도메인 별로 생성되며 도메인이 다른 경우에는 로컬 스토리지에 접근할 수 없다.
- 서로 다른 브라우저 탭이라도 동일한 도메인이라면 동일한 로컬 스토리지를 사용한다.
- 지속적으로 필요한 정보를 담기에 좋다.
- 최대 5MB까지 저장 가능하다
← 브라우저 렌더링 과정 HTTP →