
localStorage
ããŒã¯ã³ã®çš®é¡
- ã¢ã¯ã»ã¹ããŒã¯ã³ã¯éåžžããµãŒããŒã«ãã£ãŠçœ²åãããçåœã®JWTã§ãããããã¯ãã¯ã©ã€ã¢ã³ãããµãŒããŒã«å¯ŸããŠè¡ããã¹ãŠã®HTTPèŠæ±ã«å«ãŸããŠããŸããããŒã¯ã³ã¯ããªã¯ãšã¹ããæ¿èªããããã«äœ¿çšãããŸãã
- æŽæ°ããŒã¯ã³ã¯éåžžãããŒã¿ããŒã¹ã«ä¿åãããåã®ããŒã¯ã³ã®æå¹æéãåãããšãã«æ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãååŸããããã«äœ¿çšãããé·æéæå¹ãªããŒã¯ã³ã§ãã
ããŒã¯ã³ã¯ã¯ã©ã€ã¢ã³ãã®ã©ãã«æ£ç¢ºã«ä¿åããå¿ èŠããããŸããïŒ
ã¯ã©ã€ã¢ã³ãã«ããŒã¯ã³ãä¿åããäžè¬çãªæ¹æ³ã¯ãããŒã«ã«ãã©ãŠã¶ã¹ãã¬ãŒãžãšCookieã®2ã€ã§ããã©ã¡ãã®æ¹æ³ãåªããŠãããã«ã€ããŠã¯å€ãã®è°è«ããããŸããã»ãšãã©ã®äººã¯ãã»ãã¥ãªãã£ãåªããŠãããããCookieã«åŸåããŠããŸãã
ããŒã«ã«ã¹ãã¬ãŒãžãšCookieãæ¯èŒããŠã¿ãŸããããç§ãã¡ã®æ¯èŒã¯ãäž»ã«ãã®è³æãšããã«å¯Ÿããã³ã¡ã³ãã«åºã¥ããŠããŸãã
ããŒã«ã«ã¹ãã¬ãŒãž
âå©ç¹
ããŒã«ã«ã¹ãã¬ãŒãžã®äž»ãªå©ç¹ã¯ã䜿ããããããšã§ãã
- ããŒã«ã«ã¹ãã¬ãŒãžã§ã®äœæ¥ã¯éåžžã«äŸ¿å©ã§ããããã§ã¯çŽç²ãªJavaScriptã䜿çšãããŠããŸããã¢ããªã±ãŒã·ã§ã³ã«ããã¯ãšã³ãããªãããµãŒãããŒãã£ã®APIã«äŸåããŠããå Žåããµã€ãã«ç¹å®ã®Cookieãèšå®ããããã«ãããã®APIãåžžã«èŠæ±ã§ãããšã¯éããŸããã
- ããŒã«ã«ã¹ãã¬ãŒãžã䜿çšãããšããªã¯ãšã¹ãããããŒã«ã¢ã¯ã»ã¹ããŒã¯ã³ãé
眮ããå¿
èŠãããAPIãæäœãããšäŸ¿å©ã§ããäŸ-次ã®ããã«ïŒ
Authorization Bearer ${access_token}
ã
âãã¡ãªãã
ããŒã«ã«ã¹ãã¬ãŒãžã®äž»ãªæ¬ ç¹ã¯ãXSSæ»æã«å¯Ÿããè匱æ§ã§ãã
- XSSæ»æãå®è¡ãããšãæ»æè
ã¯ãµã€ãã§JavaScriptã³ãŒããå®è¡ã§ããŸããããã¯ãæ»æè
ãã«ä¿åãããŠããã¢ã¯ã»ã¹ããŒã¯ã³ã«ã¢ã¯ã»ã¹ã§ããããšãæå³ããŸã
localStorage
ã - XSSæ»æã®ãœãŒã¹ã¯ããµã€ãã«å«ãŸããŠãããµãŒãããŒãã£ã®JavaScriptã³ãŒãã§ããå¯èœæ§ããããŸããReactãVueãjQueryãGoogleAnalyticsã¹ã¯ãªãããªã©ã®ãããªãã®ã§ããå¯èœæ§ããããŸããçŸä»£ã®ç¶æ³ã§ã¯ããµãŒãããŒãã£ã®ã©ã€ãã©ãªãå«ãŸãªããµã€ããéçºããããšã¯ã»ãšãã©äžå¯èœã§ãã
ã¯ãããŒ
âå©ç¹
Cookieã®äž»ãªå©ç¹ã¯ãJavaScriptããã¢ã¯ã»ã¹ã§ããªãããšã§ãããã®çµæãããŒã«ã«ã¹ãã¬ãŒãžã»ã©XSSæ»æã«å¯ŸããŠè匱ã§ã¯ãããŸããã
- ãã©ã°
HttpOnly
ãšã»ãã¥ã¢Cookieã䜿çšããå ŽåãJavaScriptããããã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããªãããšãæå³ããŸããã€ãŸããæ»æè ãããŒãžã§èªåã®ã³ãŒããå®è¡ã§ãããšããŠããCookieããã¢ã¯ã»ã¹ããŒã¯ã³ãèªã¿åãããšã¯ã§ããŸããã - Cookieã¯ããã¹ãŠã®HTTPãªã¯ãšã¹ãã§ãµãŒããŒã«èªåçã«éä¿¡ãããŸãã
âãã¡ãªãã
ç¹å®ã®ç¶æ³ã«ãã£ãŠã¯ãCookieå ã®ããŒã¯ã³ãä¿åã§ããªãå ŽåããããŸãã
- Cookieã®ãµã€ãºã¯4KBã«å¶éãããŠããŸãããããã£ãŠã倧ããªJWTã䜿çšããå ŽåãããããCookieã«ä¿åããããšã¯ã§ããŸããã
- APIãµãŒããŒã«Cookieãæž¡ããªãã·ããªãªããããŸããäžéšã®APIã§ã¯ãããããŒã«ããŒã¯ã³ãé
眮ããå¿
èŠãããå¯èœæ§ããããŸã
Authorization
ããã®å ŽåãããŒã¯ã³ãCookieã«ä¿åããããšã¯ã§ããŸããã
XSSæ»æ
ããŒã«ã«ã¹ãã¬ãŒãžã¯ãJavaScriptã䜿çšããŠæäœããã®ãéåžžã«ç°¡åã§ãããããXSSæ»æã«å¯ŸããŠè匱ã§ãããããã£ãŠãæ»æè ã¯ããŒã¯ã³ã«ã¢ã¯ã»ã¹ããŠããããæå©ã«äœ¿çšããããšãã§ããŸãããã ããJavaScriptããHttpOnly Cookieã«å°éããããšã¯ã§ããŸããããããã¯ãCookieã䜿çšããŠã¢ã¯ã»ã¹ããŒã¯ã³ãçãããšã«ãããXSSæ»æããä¿è·ãããŠããããšãæå³ãããã®ã§ã¯ãããŸããã
æ»æè ãã¢ããªã±ãŒã·ã§ã³ã§JSã³ãŒããå®è¡ã§ããå Žåãããã¯æ»æè ããµãŒããŒã«ãªã¯ãšã¹ããéä¿¡ããã ãã§ãããŒã¯ã³ããã®ãªã¯ãšã¹ãã«èªåçã«å«ãŸããããšãæå³ããŸããæ»æè ã¯ããŒã¯ã³ã®å 容ãèªã¿åãããšãã§ããªãããããã®ãããªäœæ¥ã¹ããŒã ã¯æ»æè ã«ãšã£ãŠããã»ã©äŸ¿å©ã§ã¯ãããŸãããããããæ»æè ããããå¿ èŠãšããããšã¯ãã£ãã«ãããŸãããããã«ããã®äœæ¥ã¹ããŒã ã§ã¯ãæ»æè ãèªåã®ã³ã³ãã¥ãŒã¿ãŒã§ã¯ãªãã被害è ã®ã³ã³ãã¥ãŒã¿ãŒã䜿çšããŠãµãŒããŒãæ»æããæ¹ãæå©ãªå ŽåããããŸãã
ã¯ãããŒãšCSRFæ»æ
CSRFæ»æã¯ããŠãŒã¶ãŒãäœããã®æ¹æ³ã§ç¹å¥ãªèŠæ±ãè¡ãããã«åŒ·å¶ãããæ»æã§ããããšãã°ããµã€ãã¯é»åã¡ãŒã«ã¢ãã¬ã¹ã倿ŽããèŠæ±ãåãå ¥ããŸãã
POST /email/change HTTP/1.1
Host: site.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 50
Cookie: session=abcdefghijklmnopqrstu
email=myemail.example.com
ãã®ãããªç¶æ³ã§ã¯ãæ»æè ã¯é衚瀺ã®ãã£ãŒã«ããæã€ãã©ãŒã ãäœæããŠãPOSTãªã¯ãšã¹ããã«éä¿¡ããé»åã¡ãŒã«ã¢ãã¬ã¹ãå ¥åã§ããŸã
https://site.com/email/change
ããã®å Žåãã»ãã·ã§ã³Cookieã¯ãã®ãããªãªã¯ãšã¹ãã«èªåçã«å«ãŸããŸãã
ãã ãããã®è åšã¯
SameSite
ãå¿çããããŒã®å±æ§ãšã¢ã³ãCSRFããŒã¯ã³ã䜿çšããŠç°¡åã«ä¿è·ã§ããŸãã
å°èš
Cookieã¯æ»æã®åœ±é¿ãå®å šã«åããªãããã§ã¯ãããŸããããããŒã¯ã³ãä¿åããæåã®æ¹æ³ã¯ãå¯èœãªéããããŒã¯ã³ãéžæããããš
localStorage
ã§ããã©ãããŠïŒ
- ããŒã«ã«ã¹ãã¬ãŒãžãšCookieã¯ã©ã¡ããXSSæ»æã«å¯ŸããŠè匱ã§ãããHttpOnly Cookieã䜿çšãããšãæ»æè ãæ»æããã®ãããå°é£ã«ãªããŸãã
- Cookieã¯CSRFæ»æã«å¯ŸããŠè匱ã§ããã屿§
SameSite
ãšã¢ã³ãCSRFããŒã¯ã³ã䜿çšããããšã§ããã®ãããªæ»æã®ãªã¹ã¯ã軜æžã§ããŸãã
ããããŒã䜿çšããå¿ èŠãããå Žåã
Authorization: Bearer
ãŸãã¯JWTã4KBãã倧ããå Žåã§ããCookieã䜿çšã§ããŸããããã¯ãOWASPã¬ã€ãã©ã€ã³ãšãäžèŽããŠããŸããã察å¿ããããŒã¿ã¯åžžã«JavaScriptããå©çšã§ãããããã»ãã·ã§ã³IDãããŒã«ã«ã¹ãã¬ãŒãžã«ä¿åããªãã§ãã ãããã¯ãããŒã¯ããªãã®ãªã¹ã¯ã軜æžããã®ã«åœ¹ç«ã¡ãŸãHttpOnly
ãã
Cookieã䜿çšããŠOAuth2.0ããŒã¯ã³ãä¿åãã
ããŒã¯ã³ãä¿åããæ¹æ³ãç°¡åã«ãªã¹ãããŸãããã
- æ¹æ³1ïŒããŒã¯ã³ãããŒã«ã«ã¹ãã¬ãŒãžã«ä¿åããŸãããã®æ¹æ³ã¯XSSæ»æã®åœ±é¿ãåãããããªã£ãŠããŸãã
- æ¹æ³2ïŒããŒã¯ã³ãHttpOnlyCookieã«ä¿åããŸãããã®æ¹æ³ã¯CSRFæ»æã®åœ±é¿ãåãããããªããŸããããã®ãããªæ»æã®ãªã¹ã¯ã軜æžã§ããŸãããã®ããŒã¯ã³ã¹ãã¬ãŒãžãªãã·ã§ã³ã¯ãæåã®ãªãã·ã§ã³ãããXSSæ»æãããããã«ä¿è·ãããŠããŸãã
- æ¹æ³3ïŒãªãã¬ãã·ã¥ããŒã¯ã³ãHttpOnly Cookieã«ä¿åããããŒã¯ã³ã«ã¢ã¯ã»ã¹ããŠã¡ã¢ãªã«ä¿åããŸããããŒã¯ã³ãä¿åãããã®æ¹æ³ã¯ãCSRFæ»æã®èгç¹ããã¯ããå®å šã§ãããXSSæ»æããã®ä¿è·ããããã«åäžããŸãã
以äžã§ã¯ãããŒã¯ã³ãæ ŒçŽãã3çªç®ã®æ¹æ³ã詳ããèŠãŠãããŸããããã¯ããªã¹ããããŠãã3ã€ã®æ¹æ³ã®äžã§æãè峿·±ããã®ã«èŠããããã§ãã
CSRFæ»æã®èгç¹ããããªãã¬ãã·ã¥ããŒã¯ã³ãHttpOnly Cookieã«ä¿åããæ¹ãå®å šãªã®ã¯ãªãã§ããïŒ
æ»æè ã¯ãã«ã¢ã¯ã»ã¹ãããã©ãŒã ãäœæããå¯èœæ§ããããŸã
/refresh_token
ããã®èŠæ±ã«å¿çããŠãæ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãè¿ãããŸãããã ããæ»æè
ãHTMLãã©ãŒã ã䜿çšããŠããå Žåãæ»æè
ã¯å¿çãèªã¿åãããšãã§ããŸãããæ»æè
ããã§ãããŸãã¯AJAXèŠæ±ãæ£åžžã«å®è¡ããŠå¿çãèªã¿åãã®ãé²ãã«ã¯ãæ¿èªãµãŒããŒã®CORSããªã·ãŒãæ£ããæ§æããå¿
èŠããããŸããã€ãŸãããµãŒããŒãèš±å¯ãããŠããªãWebãµã€ãããã®èŠæ±ã«å¿çããªãããã«ããå¿
èŠããããŸãã
ã©ã®ããã«èšå®ããŸããïŒ
ã¹ããã1ïŒãŠãŒã¶ãŒãèªèšŒãããšãã«ã¢ã¯ã»ã¹ããŒã¯ã³ãè¿ããããŒã¯ã³ãæŽæ°ãã
ãŠãŒã¶ãŒãèªèšŒããåŸãèªèšŒãµãŒããŒã¯
access_token
ïŒã¢ã¯ã»ã¹ããŒã¯ã³ïŒãšrefresh_token
ïŒæŽæ°ããŒã¯ã³ïŒãè¿ããŸããã¢ã¯ã»ã¹ããŒã¯ã³ã¯å¿çæ¬æã«å«ãŸããæŽæ°ããŒã¯ã³ã¯Cookieã«å«ãŸããŸãã
æŽæ°ããŒã¯ã³ãä¿åããããã®Cookieãèšå®ããããã«äœ¿çšããå¿ èŠããããã®ã¯æ¬¡ã®ãšããã§ãã
- ãã©ã°
HttpOnly
-JavaScriptãããŒã¯ã³ãèªã¿åããªãããã«ããŸãã secure=true
ããŒã¿ãHTTPSçµç±ã§ã®ã¿éä¿¡ãããããã«ãããã©ã°ãSameSite=strict
CSRFæ»æããä¿è·ããããã«ãå¯èœãªéããã©ã°ã䜿çšããå¿ èŠããããŸãããã®ã¢ãããŒãã¯ãèªèšŒãµãŒããŒãã·ã¹ãã ããã³ããšã³ããšåããµã€ãã«å±ããŠããå Žåã«ã®ã¿äœ¿çšã§ããŸããããã§ãªãå Žåãæ¿èªãµãŒããŒã¯ããã¯ãšã³ãã«CORSããããŒãèšå®ããããä»ã®æ¹æ³ã䜿çšããŠãæŽæ°ããŒã¯ã³ã䜿çšããèŠæ±ãæ¿èªãããWebãµã€ãã«ãã£ãŠã®ã¿è¡ãããããã«ããå¿ èŠããããŸãã
ã¹ããã2ïŒã¢ã¯ã»ã¹ããŒã¯ã³ãã¡ã¢ãªã«ä¿åãã
ã¢ã¯ã»ã¹ããŒã¯ã³ãã¡ã¢ãªã«ä¿åãããšããããšã¯ãããã³ããšã³ãã³ãŒãã®ããŒã¯ã³ã倿°ã«æžã蟌ãŸããããšãæå³ããŸãããã¡ãããããã¯ããŠãŒã¶ãŒããµã€ããéããŠããã¿ããéããããããŒãžãæŽæ°ãããšãããŒã¯ã³ã倱ãããããšãæå³ããŸããããããæŽæ°ããŒã¯ã³ãããçç±ã§ãã
ã¹ããã3ïŒæŽæ°ããŒã¯ã³ã䜿çšããŠæ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãååŸãã
ã¢ã¯ã»ã¹ããŒã¯ã³ãçŽå€±ãŸãã¯ç¡å¹ã§ããããšã倿ããå Žåã¯ããšã³ããã€ã³ãã«é£çµ¡ããå¿ èŠããããŸã
/refresh_token
ããã®å Žåãã¹ããã1ã§Cookieã«ä¿åãããæŽæ°ããŒã¯ã³ããªã¯ãšã¹ãã«å«ãŸããŸãããã®åŸãAPIãªã¯ãšã¹ããè¡ãããã«äœ¿çšã§ããæ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãåãåããŸãã
ããã¯ãã¹ãŠãJWTã4KBãã倧ãããªãå¯èœæ§ããããããããŒã«é 眮ã§ããããšãæå³ã
Authorization
ãŸãã
çµæ
ããã§èª¬æããå 容ã¯ãã¯ã©ã€ã¢ã³ãã«JWTãä¿åããæ¹æ³ãšããããžã§ã¯ããããå®å šã«ããæ¹æ³ã«é¢ããåºæ¬çãªæ å ±ãæäŸããã¯ãã§ãã
JWTãã¯ã©ã€ã¢ã³ãã«ã©ã®ããã«ä¿åããŸããïŒ
