브라우저가 사용자의 설정을 기억하는 방법에는 무엇이 있는지 중점적으로 알아보자.
HTTP 요청은 기본적으로 상태가 존재하지 않는다. 즉, 항상 단발성이다.
상태가 존재하지 않기 때문에 서버는 어떤 브라우저에서 요청이 온 것인지 알 수 없다.
이 때 요청 헤더에 쿠키를 담으면 서버가 쿠키를 읽어 어디서 온 요청인지 알 수 있다.
클라이언트에서 저장, 관리하는 데이터로 브라우저를 닫아도 데이터를 유지할 수 있다.
서버에서 Set-Cookie를 응답 헤더와 함께 보내주면 클라이언트는 쿠키를 받아서 저장한다.
클라이언트에서 자체적인 조작도 가능하다.
각 상태에 수명을 정할 수 있다.
Set-Cookie : 키=값; 옵션 과 같은 형태
응답 헤더에 담으면 브라우저가 알아서 저장한다.
각 데이터에는 여러 옵션이 존재한다.
Expires : 쿠키 만료 날짜를 지정한다.
Secure : HTTPS 에서만 쿠키를 전송한다.
HttpOnly : JavaScript 에서 쿠키에 접근 못하도록 막는다. 이로인해 XSS 공격을 막을 수 있다.
XSS (크로스사이트 스크립트, 크로스사이트 스크립팅, Cross Site Scripting)
검증되지 않은 입력 값으로 사용자의 웹 브라우저에서 의도하지 않은 악성 스크립트가 실행되게 하는 공격
Max-Age : 쿠키 수명을 정하며, 이 때 Expires 옵션은 무시된다.
Domain : 도메인이 일치하는 요청만 쿠키가 전송된다.
Path : 패스와 일치하는 요청만 쿠키가 전송된다.
XSS(Cross Site Scripting) 공격을 당할 수 있다.
JavaScript를 이용한 악의적인 사용자가 다른 사용자의 쿠키 값을 탈취 할 수 있다.
쿠키를 암호화 하지 않고 보내면 쿠키 값을 중간에 탈취 당할 수 도 있다.
HTTPS를 이용하여 위의 문제점을 해결할 수 있다.
HTTP 요청시 헤더에 쿠키가 같이 포함되어 있으므로 쿠키 사이즈가 커지면 HTTP 요청 크기 역시 커지게 된다.
클라이언트가 쿠키를 서버에게 보내어도 서버는 쿠키의 주인이 누구인지 알 지 못한다. 이 때 사용되어 지는 것이 Session이다.
HTTP Session Id를 식별자로 사용자를 구분한다.
클라이언트는 HTTP Session Id를 쿠키 형태로 저장한다.
서버 자체적으로 기록하고 관리한다.
Session은 서버에 파일로 저장이 되어 있다. 만약 사용자가 엄청나게 많다면 방대한 파일의 양이 문제가 될 수 있고, 서버가 만약 2대로 Session들을 관리한다면 각 인증 정보가 분리되어 있기 대문에 제대로 된 정보를 반환하지 못할 수 있다.
그래서 서버와 클라이언트 사이의 인증은 별도 토큰을 사용하고 쿠키는 클라이언트 자체적인 지속적인 데이터 관리 용도로 많이 사용되고 있다.
이러한 상황 속에 새롭게 등장한게 웹 스토리지이다.
Cookie 대신 로컬 데이터를 관리하는 새로운 표준이 바로 웹 스토리지 이다.
클라이언트에 데이터를 저장하기 위한 새로운 방법
HTML5 부터 등장하였다.
Cookie에서 하기 힘든 것들을 지원하기 위해 등장하였다.
로컬 스토리지와 세션 스토리지가 존재한다.
데이터를 저장하면 반영구적으로 데이터가 저장된다.
브라우저를 종료해도 계속해서 데이터가 남아있다.
저장했던 도메인과 이용하는 도메인이 다른 경우엔 접근이 불가하다. 반대로 말하면 도메인만 같다면 여러 탭에서 같은 Storage를 공유한다.
Cookie와 마찬가지로 Key-Value 형태로 저장한다.
새 창을 생성할 때 마다 개별적으로 저장되는 데이터를 관리한다.
브라우저를 닫는 순간 그 창의 데이터는 사라진다.
같은 도메인이어도 세션이 다르면 데이터에 접근할 수 없다. (같은 도메인 다른 창)
Cookie와 마찬가지로 Key-Value 형태로 저장한다.
// 쿠키 관리는 String으로 하며 불편하다.
document.cookie = 'key1=value1; key2=value2';
console.log(document.cookie);
// 로컬 스토리지
// 데이터를 저장한다.
localStorage.setItem('name', 'hoon');
console.log(localStorage.getItem('name')); // hoon
// 데이터를 지운다.
localStorage.removeItem('name');
// 데이터를 전부 지운다.
localStorage.clear();
// 세션 스토리지
sessionStorage.setItem('name', 'hoon');
console.log(sessionStorage.getItem('name')); // hoon
// 데이터를 지운다.
sessionStorage.removeItem('name');
// 데이터를 전부 지운다.
sessionStorage.clear();
개발자 도구에서 Application 탭에서 웹 스토리지와 쿠키들을 확인하며 비교해보자.
JSON 객체가 모여있는 트랜잭셔널 로컬 데이터베이스를 위해 W3C 가 권고한 웹 브라우저 표준 인터페이스의 하나이다.
웹 브라우저는 데이터베이스에서 영속적인 데이터를 모아서 저장할 수 있다. 다음과 같은 특징이 존재합니다.
간단한 javascript API만으로도 database 조작이 가능합니다.
Key-Value 로 데이터를 관리합니다.
HTML, CSS, img 와 같은 static 파일보다는 JSON, XML data 등과 같이 자주 바뀌는 data를 저장하는데 주로 사용됩니다.
Transaction 처리가 가능합니다. (commit & rollback)
browser가 제공하는 local storage와 session storage는 synchronously 하게 접근되기 때문에 service worker가 사용할 수 없지만, indexedDB는 asynchronously 하게 접근될 수 있기 때문에 service worker가 사용할 수 있습니다.
하나의 App에 하나의 IndexedDB를 구성하는 것이 일반적입니다.
IndexedDB는 많은 데이터를 저장하고, 이를 Index 를 이용하여, 빠르게 검색할 수 있게 설계 되었다.
웹 스토리지 인 Local Storage 와 Session Storage 는 최대 10MB 만 저장이 가능하며, 오직 String 형태만 저장이 가능하다. 하지만 IndexedDB 는 javascript 가 이해하는 어떠한 값이라도 모두 저장할 수 있다.
IndexedDB 는 용량 제한은 특별히 없으나, HDD 저장소 상태 나 브라우저의 상태에 따라서 달라 질 수 있다.
시크릿 모드에서 IndexedDB, Storage 를 사용하면, 값은 저장되지 않고 브라우저 종료시 사라진다.
작은 규모의 데이터는 Storage 를 사용하는것이 좋지만, 큰 데이터는 IndexedDB 를 사용하는 것이 여러모로 유리하다.