localStorage, sessionStorage, 세션 및 쿠키의 기술적 장단점은 무엇이며 언제 다른 것을 사용할 것입니까?
localStorage, sessionStorage, 세션 및 쿠키의 기술적 장단점은 무엇이며 언제 다른 것을 사용할 것입니까?
답변:
이것은 매우 광범위한 질문이며, 많은 찬반 양론이 상황에 맥락이 있습니다.
모든 경우에 이러한 저장 메커니즘은 개별 컴퓨터 / 장치의 개별 브라우저에 따라 다릅니다. 여러 세션에 걸쳐 지속적으로 데이터를 저장하기 위해서는 데이터베이스, XML 또는 텍스트 / CSV 파일을 사용하는 응용 프로그램 서버 측이 필요합니다.
localStorage, sessionStorage 및 쿠키는 모두 클라이언트 스토리지 솔루션입니다. 세션 데이터는 서버에서 유지되며 사용자가 직접 제어 할 수 있습니다.
localStorage와 sessionStorage는 비교적 새로운 API (즉, 모든 레거시 브라우저가 지원하지는 않음)이며 지속성을 제외하고 거의 동일합니다 (API 및 기능 모두). sessionStorage (이름에서 알 수 있듯이)는 브라우저 세션 기간 동안 만 사용할 수 있으며 탭이나 창이 닫히면 삭제됩니다. 그러나 페이지 다시로드 후에도 지속됩니다 (소스 DOM 저장소 안내서-Mozilla 개발자 네트워크 ).
저장중인 데이터를 지속적으로 사용할 수 있어야하는 경우 sessionStorage보다 localStorage를 사용하는 것이 좋습니다. 그러나 사용자가 두 데이터를 모두 지울 수 있으므로 두 경우 모두 데이터의 지속적인 존재에 의존해서는 안됩니다.
localStorage 및 sessionStorage는 페이지간에 클라이언트 스크립트 내에서 필요한 중요하지 않은 데이터를 유지하는 데 적합합니다 (예 : 환경 설정, 게임 점수). localStorage 및 sessionStorage에 저장된 데이터는 클라이언트 / 브라우저 내에서 쉽게 읽거나 변경할 수 있으므로 응용 프로그램 내에서 중요하거나 보안 관련 데이터를 저장하는 데 의존해서는 안됩니다.
쿠키의 경우에도 마찬가지입니다. 쿠키는 사용자가 쉽게 조작 할 수 있으며 데이터를 일반 텍스트로 읽을 수도 있습니다. 따라서 중요한 데이터를 저장하려면 세션이 유일한 옵션입니다. SSL을 사용하지 않는 경우 쿠키 정보는 특히 공개 Wi-Fi에서 전송 중에 차단 될 수 있습니다.
긍정적 인 측면에서 쿠키는 최신 (지원) 브라우저가 쿠키 및 JavaScript의 값에 액세스 할 수 없음을 의미하는 HTTP 전용 플래그를 설정하여 사이트 간 스크립팅 (XSS) / 스크립트 주입과 같은 보안 위험으로부터 어느 정도의 보호를 적용 할 수 있습니다 이렇게하면 자신의 합법적 인 JavaScript가 액세스하지 못하게됩니다. 이는 로그온 쿠키 사용자의 세부 정보가 포함 된 토큰을 저장하는 데 사용되는 인증 쿠키의 경우 특히 중요합니다. 쿠키의 사본이있는 경우 모든 의도와 목적을 위해 웹 애플리케이션이있는 한 해당 사용자가됩니다. 사용자와 동일한 데이터 및 기능에 액세스 할 수 있습니다.
쿠키는 사용자 데이터의 인증 및 지속성을 위해 사용되므로 페이지에 유효한 모든 쿠키 는 동일한 요청이있을 때마다 브라우저에서 서버로 전송됩니다. 여기에는 원본 페이지 요청, 모든 후속 Ajax 요청, 모든 이미지, 스타일 시트, 스크립트 및 글꼴. 따라서 쿠키를 사용하여 많은 양의 정보를 저장해서는 안됩니다. 브라우저는 쿠키에 저장 될 수있는 정보의 크기에 제한을 둘 수도 있습니다. 일반적으로 쿠키는 인증, 세션 및 광고 추적을위한 식별 토큰을 저장하는 데 사용됩니다. 토큰은 일반적으로 사람이 읽을 수있는 정보가 아니라 응용 프로그램이나 데이터베이스에 연결된 암호화 된 식별자입니다.
기능 측면에서 쿠키, sessionStorage 및 localStorage를 사용하면 문자열 만 저장할 수 있습니다. 설정시 기본 값을 암시 적으로 변환 할 수 있지만 (읽은 후 유형으로 사용하려면 다시 변환해야 함) 객체 또는 배열은 아닙니다. (JSON을 직렬화하여 API를 사용하여 저장할 수 있습니다). 세션 스토리지는 일반적으로 서버 측 언어 / 프레임 워크가 지원하는 기본 요소 나 객체를 저장할 수있게합니다.
HTTP는 상태 비 저장 프로토콜이므로 웹 응용 프로그램은 웹 사이트로 돌아갈 때 이전 방문에서 사용자를 식별 할 수있는 방법이 없습니다. 세션 데이터는 일반적으로 쿠키 토큰을 사용하여 반복 방문을 위해 사용자를 식별합니다 (URL 매개 변수는 거의 사용되지 않을 수 있음) 같은 목적으로). 데이터는 일반적으로 슬라이딩 만료 시간 (사용자가 방문 할 때마다 갱신 됨)을 가지며, 서버 / 프레임 워크에 따라 데이터가 처리 중으로 저장되거나 (웹 서버가 충돌하거나 다시 시작하면 데이터가 손실 됨) 상태 서버 또는 데이터베이스 웹 팜 (주어진 웹 사이트에 둘 이상의 서버)을 사용할 때도 필요합니다.
세션 데이터는 응용 프로그램 (서버 쪽)에 의해 완벽하게 제어되므로 민감하거나 안전한 것이 가장 좋습니다.
서버 측 데이터의 명백한 단점은 확장 성입니다. 세션 기간 동안 각 사용자에게 서버 자원이 필요하며 클라이언트 측에 필요한 모든 데이터는 각 요청과 함께 전송되어야합니다. 서버가 사용자가 다른 사이트를 탐색하거나 브라우저를 닫는 지 여부를 알 방법이 없으므로 세션 데이터가 지정된 시간이 지나면 세션 세션이 만료되어 모든 서버 리소스가 사용되지 않도록해야합니다. 따라서 세션 데이터를 사용할 때는 특히 양식이 긴 페이지에서 데이터가 만료되어 손실 될 가능성을 알고 있어야합니다. 사용자가 쿠키를 삭제하거나 브라우저 / 장치를 전환하면 손실됩니다.
일부 웹 프레임 워크 / 개발자는 숨겨진 HTML 입력을 사용하여 세션 만료를 피하기 위해 양식의 한 페이지에서 다른 페이지로 데이터를 유지합니다.
localStorage, sessionStorage 및 쿠키는 모두 "동일 출처"규칙의 적용을 받으므로 브라우저가 정보를 시작하도록 설정 한 도메인을 제외한 데이터에 대한 액세스를 차단해야합니다.
클라이언트 스토리지 기술에 대한 자세한 내용은 Html 5로 다이빙을 참조하십시오 .
sessionStorage
때 삭제 창이 닫혀 또는 탭?
찬성 :
단점 :
장점 :
단점 :
모든 HTTP 요청 (HTML, 이미지, JavaScript, CSS 등)에 대해 데이터가 서버로 다시 전송되어 클라이언트와 서버 간의 트래픽 양이 증가합니다.
일반적으로 다음이 허용됩니다.
장점 :
localStorage
.단점 :
localStorage
에서 작동합니다 . 따라서 저장된 데이터는 동일한 원본에서만 사용할 수 있습니다.탭 간 체크 아웃 -출처 간 브라우저 탭 간 통신을 용이하게하는 방법
문서가 DOM 객체를 보유하는 윈도우 객체의 속성 중 하나 인 것처럼 JavaScript에서 'window'객체의 속성입니다.
세션 저장소 속성은 페이지 세션 기간 동안 (예 : 페이지 다시로드 및 복원을 포함하여 브라우저가 열려있는 경우) 사용 가능한 각 원본에 대해 별도의 저장소 영역을 유지합니다.
로컬 저장소는 동일한 기능을 수행하지만 브라우저를 닫았다가 다시 열었을 때도 지속됩니다.
저장된 데이터를 다음과 같이 설정하고 검색 할 수 있습니다.
sessionStorage.setItem('key', 'value');
var data = sessionStorage.getItem('key');
localStorage와 유사합니다.
sessionStorage
새 탭도 새 창입니다. 따라서 한 탭의 특정 도메인에 저장된 항목은 다음 탭의 동일한 도메인에서 사용할 수 없습니다.
로컬 스토리지 : 사용자가 브라우저 창을 닫았을 때이 데이터는 삭제되지 않고 날짜, 주, 월 및 연도에 사용할 수있는 만료 날짜없이 사용자 정보 데이터를 저장합니다.
로컬 스토리지에서 5-10mb 오프라인 데이터를 저장할 수 있습니다.
//Set the value in a local storage object
localStorage.setItem('name', myName);
//Get the value from storage object
localStorage.getItem('name');
//Delete the value from local storage object
localStorage.removeItem(name);//Delete specifice obeject from local storege
localStorage.clear();//Delete all from local storege
세션 저장소 : 웹 사용자가 브라우저 창을 닫을 때 모든 창을 삭제한다는 점을 제외하면 로컬 저장소 날짜와 같습니다.
세션 저장소에서 최대 5MB의 데이터를 저장할 수 있습니다
//set the value to a object in session storege
sessionStorage.myNameInSession = "Krishna";
세션 : 세션은 서버에 저장된 전역 변수입니다. 각 세션에는 저장된 값을 검색하는 데 사용되는 고유 한 ID가 할당됩니다.
쿠키 : 쿠키는 컴퓨터에서 이름-값 쌍으로 작은 텍스트 파일에 저장되는 데이터입니다. 쿠키가 설정되면 뒤 따르는 모든 페이지 요청이 쿠키 이름과 값을 반환합니다.
Web Storage API는 브라우저가 쿠키를 사용하는 것보다 훨씬 직관적 인 방식으로 키 / 값 쌍을 안전하게 저장할 수있는 메커니즘을 제공합니다. 웹 스토리지 API는 확장 Window
두 가지 새로운 특성을 가진 개체를 - Window.sessionStorage
와 Window.localStorage
. —이 중 하나를 호출하면 데이터 항목을 설정, 검색 및 제거 할 수있는 Storage 객체의 인스턴스가 생성됩니다. sessionStorage
및 localStorage
각 출처 (도메인)마다 다른 저장소 개체가 사용됩니다 .
저장소 개체는 개체 와 비슷한 간단한 키-값 저장소 이지만 페이지로드를 통해 그대로 유지됩니다 .
localStorage.colorSetting = '#a4509b';
localStorage['colorSetting'] = '#a4509b';
localStorage.setItem('colorSetting', '#a4509b');
키와 값은 항상 문자열 입니다. 모든 유형convert it to String
을 저장 한 다음 저장합니다. 항상Storage interface
메소드를 사용하는것이 좋습니다.
var testObject = { 'one': 1, 'two': 2, 'three': 3 };
// Put the object into storage
localStorage.setItem('testObject', JSON.stringify(testObject));
// Retrieve the object from storage
var retrievedObject = localStorage.getItem('testObject');
console.log('Converting String to Object: ', JSON.parse(retrievedObject));
웹 저장소 내 두 가지 메커니즘은 다음과 같습니다.
저장소 « 로컬 저장소 는 데이터를 디스크에 쓰고 세션 저장소는 데이터를 메모리에만 씁니다. 앱이 종료되면 세션 저장소에 기록 된 모든 데이터가 제거됩니다.
가능한 최대 스토리지는 브라우저마다 차이가 있지만, 대부분의 브라우저는 W3C가 최대 저장 용량 제한 권장 적어도 구현 한 5메가바이트을 .
+----------------+--------+---------+-----------+--------+
| | Chrome | Firefox | Safari | IE |
+----------------+--------+---------+-----------+--------+
| LocalStorage | 10MB | 10MB | 5MB | 10MB |
+----------------+--------+---------+-----------+--------+
| SessionStorage | 10MB | 10MB | Unlimited | 10MB |
+----------------+--------+---------+-----------+--------+
항상 LocalStorage 보안을 유지하고 할당량 초과 오류
QuotaExceededError :이 함수window.sessionStorage.setItem(key, value);
에서스토리지 한계를 초과하면 새 값을 설정할 수없는 경우 "QuotaExceededError"DOMException 예외가 발생합니다. (예를 들어, 사용자가 사이트 스토리지를 비활성화했거나 할당량이 초과 된 경우 설정이 실패 할 수 있습니다.)
DOMException. QUOTA_EXCEEDED_ERR은 22입니다 (예 : 바이올린) .
SecurityError :Uncaught SecurityError: Access to 'localStorage' is denied for this document
.
CHROME:-Privacy and security « Content settings « Cookies « Block third-party cookies.
StorageEvent «저장 영역이 변경되면 저장 이벤트가 문서의 Window 객체에서 시작됩니다. 사용자 에이전트가 문서에 대한 스토리지 알림을 보내려면 사용자 에이전트는 StorageEvent를 사용하여 문서 오브젝트의 Window 오브젝트에서 스토리지라는 이벤트를 발생시키는 태스크를 큐에 넣어야합니다.
참고 : 실제 예는 웹 스토리지 데모를 참조하십시오 . 소스 코드를 확인하십시오
dom / Window에서 스토리지 이벤트를 수신하여 스토리지의 변경 사항을 포착하십시오. 바이올린 .
쿠키 (웹 쿠키, 브라우저 쿠키) 쿠키는 컴퓨터에서 작은 텍스트 파일에 이름-값 쌍으로 저장된 데이터입니다.
Document.cookie를 사용한 JavaScript 액세스
Document.cookie 속성을 사용하여 JavaScript를 통해 새 쿠키를 만들 수도 있고 HttpOnly 플래그를 설정하지 않으면 JavaScript에서도 기존 쿠키에 액세스 할 수 있습니다.
document.cookie = "yummy_cookie=choco";
document.cookie = "tasty_cookie=strawberry";
console.log(document.cookie);
// logs "yummy_cookie=choco; tasty_cookie=strawberry"
안전하고 HttpOnly 쿠키 HTTP 상태 관리 메커니즘
쿠키는 종종 웹 응용 프로그램에서 사용자와 인증 된 세션을 식별하는 데 사용됩니다
HTTP 요청을 수신하면 서버는 응답과 함께 Set-Cookie 헤더를 보낼 수 있습니다 . 쿠키는 일반적으로 브라우저에 의해 저장되고 쿠키 HTTP 헤더 내의 동일한 서버에 대한 요청과 함께 쿠키가 전송됩니다.
Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
클라이언트가 종료되면 세션 쿠키 가 제거됩니다. Expires 또는 Max-Age 지시문을 지정하지 않습니다.
Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/
영구 쿠키 는 특정 날짜 (만료) 또는 특정 시간 (Max-Age) 후에 만료됩니다.
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
쿠키 HTTP 요청 헤더에는 Set-Cookie 헤더와 함께 서버가 이전에 보낸 저장된 HTTP 쿠키가 포함됩니다. XSS (Cross-Site Scripting)에 대한 공격을 완화하기 위해 XMLHttpRequest 및 Request API를 통해 Document.cookie 속성을 통해 JavaScript를 통해 HTTP 전용 쿠키에 액세스 할 수 없습니다.
쿠키는 주로 세 가지 목적으로 사용됩니다.
쿠키는 "사용자에 관한 정보를 기억하는 방법"이라는 문제를 해결하기 위해 고안되었습니다.
GitHubGist 예제
요약하면
로컬 스토리지 :
웹 스토리지는 쿠키의 개선으로 단순하게 볼 수있어 훨씬 더 큰 스토리지 용량을 제공합니다. 사용 가능한 크기는 5MB로 일반적인 4KB 쿠키보다 훨씬 더 많은 공간을 사용할 수 있습니다.
모든 HTTP 요청 (HTML, 이미지, JavaScript, CSS 등)마다 데이터가 서버로 다시 전송되지 않으므로 클라이언트와 서버 간의 트래픽 양이 줄어 듭니다.
localStorage에 저장된 데이터는 명시 적으로 삭제 될 때까지 지속됩니다. 변경 사항은 저장되어 현재 및 향후 사이트 방문시 사용할 수 있습니다.
동일 출처 정책에서 작동합니다. 따라서 저장된 데이터는 동일한 원본에서만 사용할 수 있습니다.
쿠키:
각 쿠키의 만료 시간을 설정할 수 있습니다
4K 제한은 이름, 값, 만료 날짜 등을 포함한 전체 쿠키에 적용됩니다. 대부분의 브라우저를 지원하려면 이름을 4000 바이트 미만으로 유지하고 전체 쿠키 크기를 4093 바이트 미만으로 유지하십시오.
모든 HTTP 요청 (HTML, 이미지, JavaScript, CSS 등)에 대해 데이터가 서버로 다시 전송되어 클라이언트와 서버 간의 트래픽 양이 증가합니다.
sessionStorage :
창 또는 Chrome 및 Firefox와 같은 브라우저의 탭에서만 변경 사항을 사용할 수 있습니다. 변경 사항은 현재 페이지와 동일한 창에서 나중에 사이트를 방문 할 때 저장 및 사용 가능합니다. 창을 닫으면 스토리지가 삭제됩니다. 데이터는 설정된 창 / 탭에서만 사용할 수 있습니다.
데이터는 영구적이지 않습니다. 즉, 창 / 탭을 닫으면 손실됩니다. localStorage와 마찬가지로 동일한 출처 정책에서 작동합니다. 따라서 저장된 데이터는 동일한 원본에서만 사용할 수 있습니다.