ããã«ã¡ã¯ãHabrïŒ Randall Deggesã®èšäºã ããŒã«ã«ã¹ãã¬ãŒãžã®äœ¿çšããããŠãã ãã ãã®ç¿»èš³ã玹ä»ããŸãã
ãŸããŸãå€ãã®éçºè
ãlocalStorageã䜿çšããŠãèªåã®ãµã€ãããããã³ã°ããŠããããšãçãããšãªããæ©å¯ããŒã¿ãå«ãããŒã¿ãä¿åããŠããŸãã ããããç§ããã®ãããªæ
£ç¿ãæŸæ£ããããšã匷ãå§ããçç±ã§ããããã®èšäºã§ã¯ãçã«ããªã£ãŠç§ã®èŠç¹ãå®èšŒããããšããŸãã
ã¯ããã«

ãããã£ãŠãlocalStorageã¯HTML5ã®æ°ããæ©èœã§ãããJavaScriptã®ãããã§ãŠãŒã¶ãŒã®ãã©ãŠã¶ãŒã«æ
å ±ãä¿åã§ããŸãã ããã¯ãããŒãšå€ã®ãã¢ãè¿œå ããã³åé€ã§ããå€ãè¯ãJSãªããžã§ã¯ãã§ãã å°ããªã³ãŒãã®äŸãèŠãŠã¿ãŸãããã
ãã¹ãHTMLããŒãžã§ãã®ã³ãŒããå®è¡ãããšãèŠåãŠã£ã³ããŠã«ãPetyaã¯é»ãè²ã奜ãããšãããã¬ãŒãºã衚瀺ãããŸãã éçºè
ã®ããŒã«ã䜿çšããŠãããŒã¿ãåé€ããè¡ã以åã«ã³ã¡ã³ãã¢ãŠãããå Žåãäž¡æ¹ã®å€ããã©ãŠã¶ãŒã®ããŒã«ã«ã¹ãã¬ãŒãžã«ä¿åãããŠããããšã確èªã§ããŸãã

ä»ãããªãã¯æ¬¡ã®è³ªåã«èå³ããããããããŸããïŒä¿åãããããŒã¿ãèªåçã«åé€ãããããã«ããŒã«ã«ã¹ãã¬ãŒãžã䜿çšããæ¹æ³ã¯ãããŸããïŒ å¹žããªããšã«ãHTML5éçºè
ã¯ãlocalStorageãšãŸã£ããåãããã«æ©èœããã°ããŒãã«ãªsessionStorageãªããžã§ã¯ããè¿œå ããããšã§ãããåŠçããŸããã
ã¡ãªãã
ãã®èšäºã®ç®çã¯ãlocalStorageã䜿çšããªãããšã§ãããããã§ãå€ãã®å©ç¹ããããŸãã
ãŸã第äžã«ãããã¯çŽç²ãªJavaScriptã§ãïŒ Cookieã«é¢ããäžå¿«ãªç¹ã®1ã€ã¯ïŒå®éãããŒã«ã«ã¹ãã¬ãŒãžã«å¯Ÿããå¯äžã®æ¬åœã®ä»£æ¿æ段ã§ãïŒããµãŒããŒã«ãã£ãŠäœæãããªããã°ãªããªããšããããšã§ãã ãã©ãŒãWebãµãŒããŒã§ã®äœæ¥ã¯éå±ã§æéããããããã§ãã éçãµã€ãïŒSPAãªã©ïŒãäœæããå ŽåãlocalStorageã䜿çšãããšãããã¯ãšã³ããªãã§ãµã€ããæ©èœãããããšãã§ããŸãã ããã¯éåžžã«åŒ·åãªæŠå¿µã§ããããã®ãã©ã¯ãã£ã¹ãéçºè
ã®éã§äººæ°ãããäž»ãªçç±ã®1ã€ã§ãã
ãã1ã€ã®å©ç¹ã¯ãlocalStorageã«ããŒã¿ã¹ãã¬ãŒãžçšã«å°ãªããšã5 MBããããšã§ãïŒãã®ãµã€ãºã¯ãã¹ãŠã®äž»èŠãªWebãã©ãŠã¶ãŒã§ãµããŒããããŠããŸãïŒãããã¯ãCookieïŒã4 KbïŒãããæ¡éãã«å€§ããã§ãã ããã¯ãåŸã§äœ¿çšããããã«ãã©ãŠã¶ã«æ¯èŒç倧éã®ã¢ããªã±ãŒã·ã§ã³ããŒã¿ããã£ãã·ã¥ããå¿
èŠãããå Žåã«å€§ããªå©ç¹ããããããŸãã
çæ
LocalStorageã«ã¯éåžžã«ã·ã³ãã«ãªAPIããããå€ãã®éçºè
ã¯ãããã©ãã»ã©ã·ã³ãã«ããç¥ããŸããã ããã«è©³ããèããŠã¿ãŸãããã
- æååã®ã¿ãå«ããããšãã§ãããããå°ãªããšãæååãããè€éãªãã®ã§ããã°å®å
šã«åœ¹ã«ç«ããªããªããŸãã ãã¡ããããã¹ãŠã®ããŒã¿åãæååã«å€æã§ããŸãããããã¯ã解決çã§ãã
- åæçã§ãã ããã¯ããªããžããªã«é¢é£ä»ããããŠããåæäœãé çªã«å®è¡ãããããšãæå³ããŸãã è€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãé床ãäœäžããå¯èœæ§ããããããããã¯éèŠã§ãã
- Webã¯ãŒã«ãŒã¯äœ¿çšã§ããŸããã ã€ãŸããããã©ãŒãã³ã¹ã®ããã®ããã¯ã°ã©ãŠã³ãåŠçãChromeã®æ¡åŒµæ©èœããŸãã¯ä»ã®åæ§ã®ãã®ãå©çšããã¢ããªã±ãŒã·ã§ã³ãäœæããå Žåãæ®å¿µãªãããããŒã«ã«ã¹ãã¬ãŒãžã䜿çšããŠãæ©èœããŸããã
- ä¿åããããŒã¿ã®ãµã€ãºãå¶éããŸãïŒäžèšã®ãšãããçŽ5 MBïŒã ããã¯ã倧éã®ããŒã¿ãä¿åããå¿
èŠãããã¢ããªã±ãŒã·ã§ã³ããã€ã³ã¿ãŒãããã«æ¥ç¶ããã«æ©èœããå¿
èŠãããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠã¯ãããªãå°ããªå¶éã§ãã
- æ®å¿µãªãããä¿è·ã¯æäŸãããŠããªããããããŒãžäžã®JavaScriptã³ãŒãã¯ãªããžããªã«ã¢ã¯ã»ã¹ã§ããŸãã ãã®æãéèŠãªæ¬ ç¹ã«ã€ããŠã¯ãå°ãåŸã§èª¬æããŸãã
localStorageã¯ãå€ãã®æ¡ä»¶äžã§ã®ã¿åªããããŒã«ã§ããããšãããããŸããã
å®å
šæ§
ããã«åé¡ããããŸããããŒã«ã«ã¹ãã¬ãŒãžã®æ¬ ç¹ã®ã»ãšãã©ã¯ãããããã§ãã ããããã»ãã¥ãªãã£ã¯æ±ºå®çãªèŠå ã§ãããããããã«ã€ããŠããã«è©³ãã説æããŸãããã
ãããã£ãŠãlocalStorageã¯å®å
šã§ã¯ãããŸãã ïŒ çµ¶å¯Ÿã«ïŒ æ©å¯ããŒã¿ãä¿åããããã«ããã䜿çšãã誰ããééã£ãŠããŸãã
æ©å¯ããŒã¿ã®æå³ãç解ããŸãããïŒ
-ãŠãŒã¶ãŒID
-ã»ãã·ã§ã³ID
-JWTïŒJSON WebããŒã¯ã³ïŒ
-å人æ
å ±
-ã¯ã¬ãžããã«ãŒãæ
å ±
-APIããŒ
-äžè¬ã«å
¬éããªããã®ä»ã®æ
å ±
LocalStorageã¯ããã©ãŠã¶ã«ããŒã¿ãä¿åããããã®å®å
šãªã¡ã«ããºã ãšããŠã§ã¯ãªããå°ããªãµã€ã/ Webã¢ããªã±ãŒã·ã§ã³ã®äœæã容æã«ããããã®ããŒãšå€ã®åçŽãªã¹ãã¬ãŒãžãšããŠéçºãããŸããã ãããŠããã ãã§ãã äžçã§æãå±éºãªããšã¯äœã ãšæããŸããïŒ ããïŒ Javascript ãããã£ãŠãéèŠãªãã®ãããŒã«ã«ã¹ãã¬ãŒãžã«ä¿åããå Žåãå°çäžã§æãä¿¡é Œæ§ã®äœãé庫ã«æãç§å¯ã®æ
å ±ãé ãããããšãæ³åããŠãã ããã è¯ãèãã§ã¯ãããŸããã
å®éãåé¡ã¯ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒ XSS ïŒã§ãã ãã®è匱æ§ã®è©³çŽ°ãªèª¬æãè² æ
ããããªãã®ã§ãç°¡åã«èª¬æããŸããããã«ãŒããµã€ãã§JavaScriptã³ãŒããå®è¡ã§ããå ŽåãlocalStorageãããã¹ãŠã®æ
å ±ãç°¡åã«åŒãåºããŠãµãŒããŒã«éä¿¡ãããŠãŒã¶ãŒã»ãã·ã§ã³ããŒã¿ãªã©ãååŸããŸãã ã
ããªãã¯å察ãããããããŸããïŒããŸããç§ã®ãµã€ãã¯å®å
šã§ãã誰ãç§ã®ãµã€ãã§ã¹ã¯ãªãããå®è¡ã§ããŸãããã ãããŠãããã«ãã£ããããããŸãã çè«çã«ã¯ãããªãã¯çµ¶å¯Ÿã«æ£ããã§ãããå®éãããéæããããšã¯å®éäžäžå¯èœã§ãã çç±ãèŠãŠã¿ãŸãããã
ãã£ãšããªãã®ãµã€ãã«ã¯ä»ã®ãµãŒããŒããããŠã³ããŒããããã¹ã¯ãªãããå«ãŸããŠããŸãã æãäžè¬çãªãªãã·ã§ã³ã¯ã次ãžã®ãªã³ã¯ã§ãã
-ããŒãã¹ãã©ãã
-jQuery
-VueãReactãAngularãªã©
-Google Analytics
ãŸããªã©ã ãã®åŸãæ»æè
ããµã€ãã§ã¹ã¯ãªãããå®è¡ããå¯èœæ§ããããŸãã 次ã®ã³ãŒããå«ãŸããŠãããšæ³åããŠãã ããã
<script src="https://awesomejslibrary.com/minified.js"></script>
awesomejslibrary.comãæ»æãããminifed.jsã¹ã¯ãªãããå€æŽããããšããŸãã ãã®å Žåãã¹ã¯ãªãããlocalStorageãããã¹ãŠã®ããŒã¿ãåéããçãŸããæ
å ±ãä¿åããããã«ç¹å¥ã«äœæãããAPIã«éä¿¡ãããªã¹ã¯ããããŸãã ããã«ãŒã¯ãŠãŒã¶ãŒããŒã¿ãçã¿ãŸãããã圌ãããªããïŒéçºè
ãšããŠïŒç¥ãããšã¯ãããŸããã§ããã æªããªãã·ã§ã³ã
ç§ãã¡ã¯çããã¹ãŠã®jsã¹ã¯ãªããããµãŒããŒã«ããŒã«ã«ã«é
眮ããå¿
èŠããããšèããããšããããããŸãããå®éã«ã¯ããã¯ãã£ãã«èµ·ãããŸããã å€ãã®äŒæ¥ã§ã¯ãããŒã±ãã£ã³ã°æ
åœè
ã¯WYSIWYGãšãã£ã¿ãŒããã®ä»ã®ããŒã«ã䜿çšããŠããµã€ãã«çŽæ¥å€æŽãå ããããšãã§ããŸãã ããã¯çåãæããããŸãããµãŒãããŒãã£ã®JSããµã€ãã®ã©ãã§ã䜿çšãããŠããªãããšãæ¬åœã«ç¢ºä¿¡ããŠããŸããïŒ çããŸãïŒãããã ãããã£ãŠããŠãŒã¶ãŒæ
å ±ã®æŒæŽ©ã®ãªã¹ã¯ãæžããããã«ã localStorageã«æ©å¯ããŒã¿ãä¿åããªãã§ãã ãã ã
ããŒã¯ã³ã«ã€ããŠ
ããŒã«ã«ã¹ãã¬ãŒãžã«æ©å¯ããŒã¿ãä¿åããå¿
èŠããªãçç±ãååã«èª¬åŸåããã£ãŠèª¬æããããã«æããŸãããJSON Web TokenïŒJWTïŒã䜿çšããŠç¶æ³ãåå¥ã«æããã«ãã䟡å€ããããŸãã localStorageã«JWTãä¿åããå€ãã®éçºè
ã¯ãããããŠãŒã¶ãŒå/ãã¹ã¯ãŒããšæ¬è³ªçã«åãã§ããããšãèªèããŠããŸããã
ããã«ãŒããããã®ããŒã¯ã³ãã³ããŒãããšããµãŒããŒã«ãªã¯ãšã¹ããéä¿¡ã§ããããã«ãªãããŠãŒã¶ãŒã¯ããã«ã€ããŠç¥ãããšãã§ããªããªããŸãã ãããã£ãŠãã¯ã¬ãžããã«ãŒãæ
å ±ããã¹ã¯ãŒããšåãããã«æ±ããŸããã€ãŸããæ°åã®ãã¥ãŒããªã¢ã«ãYoutubeã®ãããªãããã«ã¯å€§åŠã®ããã°ã©ãã³ã°ã³ãŒã¹ã«åããŠãlocalStorageã«ä¿åããªãã§ãã ããã ããã¯ééã£ãŠããŸãïŒ èªèšŒã®ããã«ããŒã¯ã³ãããŒã«ã«ãªããžããªã«ä¿åããããã¢ããã€ã¹ãããå Žåã¯ããã®èšäºãèŠããŠãã ããã
代æ¿æ¡
ãããã£ãŠãlocalStorageãæ
å ±ãä¿åããããã®çæ³çãªãœãªã¥ãŒã·ã§ã³ãšã¯ã»ã©é ãããšã確èªããåŸã代æ¿ãªãã·ã§ã³ã«ç²Ÿéããæãæ¥ãŸããã
æ©å¯ããŒã¿
ãã®ãããªããŒã¿ãä¿åããããã®å¯äžã®æ£ãã決å®ã¯ããµãŒããŒåŽã®ã»ãã·ã§ã³ã§ãã ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
- ãŠãŒã¶ãŒããµã€ãã«ãã°ã€ã³ãããšããäžæã®ã»ãã·ã§ã³èå¥åãäœæããæå·åãããæå·åãããCookieã«ä¿åããå¿
èŠããããŸãã ããããçš®é¡ã®Webãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠããå Žåã¯ããCookieã䜿çšããŠãŠãŒã¶ãŒã»ãã·ã§ã³ãäœæããæ¹æ³ããã°ãŒã°ã«ã§æ€çŽ¢ãããã®ã¬ã€ãã«åŸã£ãŠãã ããã
- ãã¬ãŒã ã¯ãŒã¯ã§äœ¿çšãããCookieã©ã€ãã©ãªã®èšå®ã§ãhttpOnlyããæå¹ã«ãªã£ãŠããããšã確èªããŠãã ããã ããã«ããããã©ãŠã¶ã§Cookieã衚瀺ã§ããªããªããŸããããã¯ããµãŒããŒåŽã§ã®å®å
šãªäœ¿çšã«å¿
èŠã§ãã 詳现ã«ã€ããŠã¯ã Jeff Atwoodã®èšäºãèªãããšããå§ãããŸãã
- ããã«ãèšå®ãSameSite = strict ïŒ CSRFæ»æãé²ãããïŒã瀺ãã secure = true ïŒæå·åãããæ¥ç¶ã®ã¿ãä»ããŠCookieã®éä¿¡ãä¿èšŒãã ïŒã瀺ãããšã確èªããå¿
èŠããããŸãã
- ãŠãŒã¶ãŒããµã€ããèŠæ±ãããšããã»ãã·ã§ã³æ
å ±ïŒCookieããæœåºïŒã䜿çšããŠã¢ã«ãŠã³ãæ
å ±ãååŸããŸãã ãã®åŸãã»ãã·ã§ã³èå¥åãå確èªããã«ããã®ã¢ã«ãŠã³ãã«é¢é£ä»ããããæ©å¯ããŒã¿ããŠãŒã¶ãŒã«èªç±ã«éä¿¡ã§ããŸãïŒãã¡ãããæåã®æ€èšŒã«åæ Œããå ŽåïŒ
ãã®ã·ã³ãã«ã§ãæãéèŠãªããšã¯ãå®å
šãªã¢ãã«ã§ãã ãããŠããã¡ãããããã䜿çšããŠãä»»æã®ã¬ãã«ã®ãããžã§ã¯ããã¹ã±ãŒãªã³ã°ã§ããŸãã
éè¡ããŒã¿
æ©å¯ã§ã¯ãªããæååãããè€éãªæ
å ±ãä¿åããå¿
èŠãããå Žåã¯ãIndexedDBãæé©ãªãœãªã¥ãŒã·ã§ã³ã§ãã ããã¯ãäœã¬ãã«APIãåããããŒã¿ããŒã¹ãã©ã³ã¶ã¯ã·ã§ã³ã·ã¹ãã ã§ããããã¯ãããŸããŸãªããŒã¿ïŒ/ blobãã¡ã€ã«ãå«ãïŒããã©ãŠã¶ãŒã«çŽæ¥æ ŒçŽããã®ã«é©ãããªãã·ã§ã³ã§ãã 詳现ã«ã€ããŠã¯ãGoogleã®ã¬ã€ãããå
¥æã§ããŸã ã
ãªãã©ã€ã³ããŒã¿
ã€ã³ã¿ãŒãããã«æ¥ç¶ããã«ã¢ããªã±ãŒã·ã§ã³ãæ©èœããããã«ããã«ã¯ãIndexedDBãšCache APIïŒService Workerã®äžéšïŒã®çµã¿åãããæé©ãªãœãªã¥ãŒã·ã§ã³ã«ãªããŸããããã«ãããæ£ããæäœã«å¿
èŠãªãã¹ãŠã®ãªãœãŒã¹ããã£ãã·ã¥ã§ããŸãã Googleããã®äœ¿çšã«é¢ããåªãããã¥ãŒããªã¢ã«ã¯ãã¡ãã§ãã
ãããã«
çãããä»ç解ããããšãé¡ã£ãŠããŸãïŒçµå±ç解ã§ããŸããïŒïŒ ãããªãã¯ã§é«æ§èœãªã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããŠããªãããŒã¿ãä¿åããå¿
èŠãããå Žåã5 MBãè¶
ãããæååã®ã¿ã§æ§æãããŠãããããããŒã«ã«ã¹ãã¬ãŒãžã¯ç®çã«é©ããããŒã«ã«ãªããŸãã
ãã以å€ã®å Žåã¯ãã¹ãŠã ããŒã«ã«ã¹ãã¬ãŒãžã䜿çšããªãã§ãã ãã ïŒ ä»£æ¿ãœãªã¥ãŒã·ã§ã³ã䜿çšããŸãã
ãããŠããé¡ãããŸããã»ãã·ã§ã³æ
å ±ïŒJSON WebããŒã¯ã³ãªã©ïŒãlocalStorageã«ä¿åããªãã§ãã ããã ããã«ããããŠãŒã¶ãŒã«å®³ãåãŒãå€æ°ã®æ»æã«å¯ŸããŠãµã€ããè匱ã«ãªããŸãã
PSãªãXSSããä¿è·ããæ¹æ³ãšããŠContent Sequiriy Policy ïŒCSPïŒã«èšåããªãã£ãã®ãçåã«æã人ã®ããã«ã ãã®çç±ã¯ç°¡åã§ããããã¯ãç§ã説æããç¶æ³ã§ã¯åœ¹ã«ç«ããªãã§ãããã CSPã䜿çšããŠJavaScriptãæ¥ç¶ãããã¹ãŠã®ãµãŒãããŒãã£ãã¡ã€ã³ããã§ãã¯ããŠãããã¯ã€ããªã¹ãã®ãµã€ãããããã³ã°ãããå Žåãããã¯åœ¹ã«ç«ã¡ãŸããã
æ®å¿µãªããã PPS ãµããªãœãŒã¹ã®æŽåæ§ãåé¡ã®è§£æ±ºçã§ã¯ãããŸããã ã»ãšãã©ã®ããŒã±ãã£ã³ã°ããŒã«ãåºåãããã¯ãŒã¯ãªã©ã ïŒæãäžè¬çãªãµãŒãããŒãã£ã®ã¹ã¯ãªããïŒãµããªãœãŒã¹ã®æŽåæ§ã¯ã»ãšãã©äœ¿çšãããŸããããããã®ã¹ã¯ãªããã®ãããã€ããŒã¯ãæ©èœããã®ä»ã®æ©èœãæ¡åŒµããããã«ã¹ã¯ãªãããå€æŽããããšãå€ãããã§ãã
Local Storageã®äœ¿çšãåæ¢ããŠãã ããã®ç¿»èš³ã
èè
ã®èš±å¯ãåŸãŠå
¬éã