JWT ãšã¯ïŒ
JSON Web TokenïŒJWTïŒã¯ãäºè éã§ã¯ã¬ãŒã ãåãæž¡ãããã®ã³ã³ãã¯ãã§ URL ã»ãŒããªåœ¢åŒã§ããOAuth 2.0ãOpenID ConnectãçŸä»£ã® API èªèšŒã®æšæº bearer ããŒã¯ã³åœ¢åŒã§ãã
JWT ã¯3ã€ã® Base64URL ãšã³ã³ãŒãéšåããããã§åºåã£ãŠæ§æãããŸãïŒheader.payload.signatureãHeader ã¯çœ²åã¢ã«ãŽãªãºã ïŒHS256ãRS256 ãªã©ïŒã宣èšããŸããPayload 㯠"exp"ïŒæå¹æéïŒã "iat"ïŒçºè¡æå»ïŒãªã©ã®ç»é²ã¯ã¬ãŒã ãšã«ã¹ã¿ã ããŒã¿ãæã¡ãŸããSignature ã¯ããŒã¯ã³ãæ¹ãããããŠããªãããšãä¿èšŒããŸãã
ãã®ãã³ãŒããŒã¯ããŒã¯ã³ãåå²ããheader ãš payload ã Base64URL ãã³ãŒãã㊠JSON ãšããŠè§£æãã"exp" ã¯ã¬ãŒã ãçŸåšæå»ãšæ¯èŒããŠããŒã¯ã³ãæå¹ãã©ãããå€å®ããŸãã
äœ¿ãæ¹
- 1ããã¹ããšãªã¢ã« JWT ã貌ãä»ããŸããå ¥åãšåæã«ãã³ãŒããããŸãã
- 2ãã³ãŒãããã Header ã§ã¢ã«ãŽãªãºã ãšããŒã¯ã³ã¿ã€ãã確èªããŸãã
- 3Payload ã® subãexpãiat ãªã©ã®ã¯ã¬ãŒã ãšã«ã¹ã¿ã ãã£ãŒã«ãã確èªããŸãã
- 4ã¹ããŒã¿ã¹ãããžã§æéåããæå¹ãã確èªããŸãã
- 5ã³ããŒãã¿ã³ã§ãã©ãŒãããæžã¿ JSON ãååŸã§ããŸãã
å©çšã·ãŒã³
èªèšŒãããŒã®ãããã°
ã¹ããŒãžã³ã°ã§ã¯åãããããã¯ã·ã§ã³ã§å€±æããå Žåãåç°å¢ã®ããŒã¯ã³ã貌ãä»ã㊠claims ãæ¯èŒãissuer ã®éããaudience ãšã©ãŒãããŒã«äžè¶³ãªã©ãå³åº§ã«çºèŠã§ããŸãã
ããŒã¯ã³æå¹æéã®ç¢ºèª
API ã 401 ãè¿ããšããããŒã¯ã³ã®åé¡ããšã³ããã€ã³ãã®åé¡ãåãããªãå Žåãããã«è²Œãä»ããŠæ£ç¢ºãª UTC æå¹æéã確èªã§ããŸãã
ãã°å ±æåã®ããŒã¯ã³ç¢ºèª
Slack ããã°ã¬ããŒãã«ããŒã¯ã³ã貌ãåã«ããã³ãŒãããŠå ±æãã¹ãã§ãªãå人æ å ±ãå«ãŸããŠããªãã確èªããŸãã
JWT æ§é ã®åŠç¿
åã㊠JWT èªèšŒãå®è£ ããå Žåããµã³ãã«ããŒã¯ã³ã貌ãä»ã㊠headerãclaimsãsignature ã®æ§é ãçè§£ã§ããŸãã
ã»ãã¥ãªãã£ã®ãã³ã
眲åãæ€èšŒããã« JWT ãä¿¡é Œããªã
ãã³ãŒãã¯æ€èšŒã§ã¯ãããŸãããæ¬ããŒã«ã¯ããŒã¯ã³ã®å 容ã衚瀺ããŸããããããã¯ã·ã§ã³ã§ã¯çºè¡è ã®å ¬ééµãŸãã¯å ±æç§å¯éµã§çœ²åãæ€èšŒããå¿ èŠããããŸãã
ããŒã¯ã³ã®æå¹æéãçã
ã¢ã¯ã»ã¹ããŒã¯ã³ã¯æ°åã§æéåãã«ããrefresh ããŒã¯ã³ã§é·æã»ãã·ã§ã³ãç¶æããŸããexp ãæ°é±éå ã®ããŒã¯ã³ã¯ã»ãã¥ãªãã£äžã®åé¡ã§ãã
payload ã«ç§å¯æ å ±ãå ¥ããªã
JWT ã¯æå·åã§ã¯ãªããšã³ã³ãŒãã§ããããŒã¯ã³ãæã€äººã¯èª°ã§ããã³ãŒãã§ããŸãããã¹ã¯ãŒããAPI ããŒãæ©å¯å人æ å ±ã claims ã«ä¿åããªãã§ãã ããã
ã¢ã«ãŽãªãºã ããããŒã確èª
"alg":"none" æ»æã¯åšç¥ã®è匱æ§ã§ããheader ã« "none" ã衚瀺ããããåé¡ããããŸãããããã¯ã·ã§ã³ã§ã¯åžžã« HS256ãRS256 以äžã䜿çšããŠãã ããã
äŸ
æšæº HS256 ããŒã¯ã³
æšæºã¯ã¬ãŒã ãå«ãå žåçãªã¢ã¯ã»ã¹ããŒã¯ã³ã
Input
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphbmUgRG9lIiwiZXhwIjoyMDAwMDAwMDAwfQ.signatureOutput
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "Jane Doe",
"exp": 2000000000
}æéåãããŒã¯ã³
exp ãéå»ã«èšå®ãããããŒã¯ã³ â ãã³ãŒããŒãæéåããšããŠãã©ã°ãç«ãŠãŸãã
Input
eyJhbGciOiJub25lIn0.eyJleHAiOjF9.signatureOutput
Header: { "alg": "none" }
Payload: { "exp": 1 }
ã¹ããŒã¿ã¹: æéåã (1970-01-01T00:00:01.000Z)æ©èœ
- å ¥åãšåæã«ãã³ãŒã â ãã¿ã³äžèŠ
- 100% ã¯ã©ã€ã¢ã³ããµã€ããããŒãžèªèŸŒåŸã¯ãããã¯ãŒã¯ãªã¯ãšã¹ããªã
- æ£ç¢ºãª UTC ã¿ã€ã ã¹ã¿ã³ãã§æå¹æé衚瀺
- headerãpayloadãsignature ãåé¢è¡šç€º
- ã»ã¯ã·ã§ã³ããšã«ã¯ã³ã¯ãªãã¯ã³ããŒ
- ãã©ã€ãã·ãŒåªå ïŒããŒã¯ã³ã¯ãã©ãŠã¶ããåºãŸãã
ãããã質å
ãããã¯ã·ã§ã³ã® JWT ã貌ãä»ããŠãå®å
šã§ããïŒ
ã¯ãããã©ãŠã¶ã® atob() 颿°ã䜿ãå®å šã«ããŒã«ã«ã§åäœããŸããDevTools ã®ãããã¯ãŒã¯ã¿ãã§ç¢ºèªã§ããŸãïŒãªã¯ãšã¹ãã¯äžåçºçããŸããã
眲åã®æ€èšŒã¯ã§ããŸããïŒ
ã§ããŸãããçœ²åæ€èšŒã«ã¯çœ²åéµãå¿ èŠã§ããæ¬ããŒã«ã¯ããŒã¯ã³ã®å 容ã®ãã³ãŒããšè¡šç€ºã®ã¿ãè¡ããŸãã
"alg: none" ãšã¯äœã§ããïŒ
ããŒã¯ã³ã«æå·çœ²åããªãããšãæå³ããŸããæ¢ç¥ã®æ»æãã¯ã¿ãŒïŒCVE-2015-9235ïŒã§ããæ£èŠã·ã¹ãã ã¯ãããã¯ã·ã§ã³ã§ "none" ã䜿çšããŸããã
JWEïŒæå·åããŒã¯ã³ïŒããã³ãŒãã§ããŸããïŒ
ã§ããŸãããæ¬ããŒã«ã¯ JWSïŒçœ²åããŒã¯ã³ïŒã®ã¿å¯Ÿå¿ã§ããJWE ã¯ãããåºåãã§5ã€ã®éšåãæã¡ã埩å·éµãå¿ èŠã§ãã
ãã³ããšé¢é£ã¯ãŒã¯ãããŒ
- Base64 payload ãæåã§ãã³ãŒããããå Žåã¯Base64 ãšã³ã³ãŒããŒ.
- ãã³ãŒããã JSON ãæŽåœ¢ãããå Žåã¯JSON ãã©ãŒããã¿ãŒ.
- ããŒã¯ã³ã®ã¿ã€ã ã¹ã¿ã³ãã確èªããå Žåã¯ã¿ã€ã ã¹ã¿ã³ã倿åš.