JWT ãšã¯ïŒJSON Web Token å®å šã¬ã€ã
JWT ãšã¯ïŒ
JSON Web TokenïŒJWTïŒã¯ãJSON ãªããžã§ã¯ããšããŠåœäºè éã§æ å ±ãå®å šã«éä¿¡ããããã®ãã³ã³ãã¯ãã§èªå·±å®çµåã®æ¹æ³ãå®çŸ©ãããªãŒãã³ã¹ã¿ã³ããŒãïŒRFC 7519ïŒã§ããJWT ã¯çŸä»£ã® Web ã¢ããªã±ãŒã·ã§ã³ã§æ¯é çãªããŒã¯ã³åœ¢åŒã§ããããŠãŒã¶ãŒèªèšŒã API èªå¯ãããã€ã¯ããµãŒãã¹éã®å®å šãªããŒã¿äº€æãŸã§ãããããçšéã«äœ¿çšãããŠããŸãã
JWT èªèšŒã®ä»çµã¿
JWT èªèšŒã¯ã¹ããŒãã¬ã¹ãªãã¿ãŒã³ã«åŸãããµãŒããŒåŽã®ã»ãã·ã§ã³ã¹ãã¬ãŒãžãäžèŠã«ããŸãããã®ãããŒãçè§£ããããšã¯ãJWT ãçŸä»£ã® API ã»ãã¥ãªãã£ã®ããã©ã«ãã®éžæè¢ã«ãªã£ãçç±ãçè§£ããéµã§ãã
èªèšŒãããŒ
- ãŠãŒã¶ãŒããã°ã€ã³ãã â ã¯ã©ã€ã¢ã³ããèªèšŒæ å ±ïŒãŠãŒã¶ãŒåãšãã¹ã¯ãŒãïŒãèªèšŒãµãŒããŒã«éä¿¡ããŸãã
- ãµãŒããŒã JWT ãäœæãã â ãµãŒããŒãèªèšŒæ å ±ãæ€èšŒãããŠãŒã¶ãŒã® ID ãšæš©éãå«ã JWT ãäœæããŠãç§å¯éµãŸãã¯å ¬ééµã§çœ²åããã¯ã©ã€ã¢ã³ãã«è¿ããŸãã
- ã¯ã©ã€ã¢ã³ããããŒã¯ã³ãä¿åãã â ã¯ã©ã€ã¢ã³ã㯠JWT ããé垞㯠localStorageãsessionStorageããŸã㯠HTTP-only ã¯ãããŒã«ä¿åããŸãã
- ã¯ã©ã€ã¢ã³ããåãªã¯ãšã¹ãã§ããŒã¯ã³ãéä¿¡ãã â ãã®åŸã®ãã¹ãŠã® API ãªã¯ãšã¹ãã§ãã¯ã©ã€ã¢ã³ã㯠Bearer ã¹ããŒã ã䜿çšããŠ
AuthorizationããããŒã« JWT ãå«ããŸã:Authorization: Bearer <token>ã - ãµãŒããŒãããŒã¯ã³ãæ€èšŒãã â ãµãŒããŒã¯ JWT 眲åãæ€èšŒããæå¹æéã確èªãããŠãŒã¶ãŒã¯ã¬ãŒã ãæœåºããŠãªã¯ãšã¹ããèªå¯ããŸãã
- ã»ãã·ã§ã³ã«ãã¯ã¢ãããäžèŠ â JWT ã«å¿ èŠãªæ å ±ããã¹ãŠå«ãŸããŠããããããµãŒããŒã¯ãŠãŒã¶ãŒãèå¥ããããã«ããŒã¿ããŒã¹ããã£ãã·ã¥ãç §äŒããå¿ èŠããããŸããã
ãªããããéèŠãªã®ã
åŸæ¥ã®ã»ãã·ã§ã³ããŒã¹ã®èªèšŒã¯ãã»ãã·ã§ã³ ID ããµãŒããŒã®ã¡ã¢ãªãŸãã¯ããŒã¿ããŒã¹ã«ä¿åããŸããèªèšŒãããåãªã¯ãšã¹ãã«ã¯ã«ãã¯ã¢ãããå¿ èŠã§ããJWT ã¯ãã®ã«ãã¯ã¢ãããæé€ããŸã â ããŒã¯ã³èªäœããŠãŒã¶ãŒã® ID ã蚌æããŸããããã«ãããã¯ã©ã¹ã¿ãŒå ã®ã©ã®ãµãŒããŒã§ãå ±æã»ãã·ã§ã³ç¶æ ãªãã§ããŒã¯ã³ãæ€èšŒã§ãããããJWT ããŒã¹ã®ã·ã¹ãã ã¯æ¬è³ªçã«ã¹ã±ãŒã©ãã«ã«ãªããŸãã
JWT ãšã»ãã·ã§ã³ããŒã¹èªèšŒã®æ¯èŒ
| é ç® | JWT èªèšŒ | ã»ãã·ã§ã³ããŒã¹èªèšŒ | |--------|--------------------|------------------------------| | ã¹ãã¬ãŒãž | ã¯ã©ã€ã¢ã³ãåŽïŒããŒã¯ã³å ïŒ | ãµãŒããŒåŽïŒã¡ã¢ãªãŸã㯠DBïŒ | | ã¹ã±ãŒã©ããªã㣠| å ±æã»ãã·ã§ã³ã¹ãã¢äžèŠ | ã€ã³ã¹ã¿ã³ã¹éã§å ±æã»ãã·ã§ã³ã¹ãã¢ãå¿ èŠ | | ã¯ãã¹ãã¡ã€ã³ | ãã¡ã€ã³ããŸããã§èªç¶ã«æ©èœ | ã»ãã·ã§ã³å ±æãå°é£ | | ã¢ãã€ã«å¯Ÿå¿ | 察å¿ïŒã¯ãããŒäžèŠïŒ | ã¯ãããŒãµããŒããå¿ èŠ | | å€±å¹ | å°é£ïŒããŒã¯ã³ãæéåãã«ãªããŸã§ïŒ | 容æïŒã¹ãã¢ããã»ãã·ã§ã³ãåé€ïŒ | | ãã€ããŒããµã€ãº | ãªã¯ãšã¹ãããšã«å€§ããïŒããããŒå ã®ããŒã¯ã³ïŒ | æå°éïŒã»ãã·ã§ã³ ID ã®ã¿ïŒ |
JWT ã API ã»ãã¥ãªãã£ã«äœ¿çšãããçç±
JWT ãèªèšŒã«é©ãããã®ã«ããç¹æ§ã¯ãAPI ã®ä¿è·ã«ãçæ³çã§ãã
ã¹ããŒãã¬ã¹ã§ã¹ã±ãŒã©ãã«
ãã¹ãŠã® JWT ã«ã¯ããªã¯ãšã¹ããèªå¯ããããã«ãµãŒããŒãå¿ èŠãšãããã¹ãŠã®æ å ±ãå«ãŸããŠããŸããç §äŒããã»ãã·ã§ã³ããŒã¿ããŒã¹ãã確èªãããã£ãã·ã¥ãããµãŒããŒéã§åæããç¶æ ããããŸãããããŒããã©ã³ãµãŒã¯èª¿æŽãªãã§ãªã¯ãšã¹ããä»»æã®ãµãŒããŒã€ã³ã¹ã¿ã³ã¹ã«ã«ãŒãã£ã³ã°ã§ããŸãã
ã¯ãã¹ãã¡ã€ã³ãšã¯ãã¹ãªãªãžã³
JWT ã¯ç°ãªããã¡ã€ã³ããªãªãžã³ããŸããã§èªç¶ã«æ©èœããŸããauth.example.com ã«ãã£ãŠçºè¡ãããããŒã¯ã³ã¯ãapi.example.com ãš admin.example.com ãžã®ã¢ã¯ã»ã¹ã«äœ¿çšã§ããŸããããã«ãããJWT ã¯ã·ã³ã°ã«ãµã€ã³ãªã³ïŒSSOïŒã·ã¹ãã ã®åºç€ãšãªããŸãã
ãã现ããèªå¯
JWT ãã€ããŒãã«ã¯ãããŒã«ãæš©éãçµç¹ã¡ã³ããŒã·ããã®ã«ã¹ã¿ã ã¯ã¬ãŒã ãå«ããããšãã§ããŸã:
{
"sub": "user_abc123",
"role": "admin",
"permissions": ["read:users", "write:users", "delete:users"],
"org_id": "org_xyz789",
"iat": 1516239022,
"exp": 1516325422
}
API ãµãŒããŒã¯ã远å ã®ã«ãã¯ã¢ãããªãã§ãããã®ã¯ã¬ãŒã ãããŒã¯ã³ããçŽæ¥èªã¿åããŸãã
ã·ã³ã°ã«ãµã€ã³ãªã³ïŒSSOïŒã®ããã® JWT
ã·ã³ã°ã«ãµã€ã³ãªã³ã¯ãJWT ã®æãäžè¬çãªãŠãŒã¹ã±ãŒã¹ã® 1 ã€ã§ããå žåç㪠SSO ã¢ãŒããã¯ãã£ã§ã¯:
- ãŠãŒã¶ãŒã ID ãããã€ããŒïŒIdPïŒâ Auth0ãOktaãKeycloak ãªã© â ã«ãã°ã€ã³ããŸãã
- IdP ãç§å¯éµã§çœ²åãã JWT ãçºè¡ããŸãã
- ãŠãŒã¶ãŒããã® JWT ãè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ã«æç€ºããŸãã
- åã¢ããªã±ãŒã·ã§ã³ã IdP ã®å ¬ééµã䜿çšããŠçœ²åãæ€èšŒããŸãã
- åã¢ããªã±ãŒã·ã§ã³ã¯ããªã¯ãšã¹ãããšã« IdP ãšéä¿¡ããããšãªãããŒã¯ã³ãä¿¡é ŒããŸãã
ãã®ãã¿ãŒã³ã«ããã1 åã®ãã°ã€ã³ã§å€æ°ã®ãµãŒãã¹ïŒã¡ãŒã«ããã¡ã€ã«ã¹ãã¬ãŒãžããããžã§ã¯ã管çã人äºã·ã¹ãã ïŒãžã®ã¢ã¯ã»ã¹ãèš±å¯ãããåãµãŒãã¹ãç¬èªã®ãã°ã€ã³ãããŒãå®è£ ããå¿ èŠããªããªããŸãã
JWT ã»ãã¥ãªãã£ã®ãã¹ããã©ã¯ãã£ã¹
JWT 㯠API ã»ãã¥ãªãã£ã®åŒ·åºãªåºç€ãæäŸããŸãããæ£ããå®è£ ãäžå¯æ¬ ã§ãã
ããŒã¯ã³ã®æå¹æéãçããã
expïŒæå¹æéïŒã¯ã¬ãŒã ãçãæé â ã¢ã¯ã»ã¹ããŒã¯ã³ã§ã¯ 15 åãã 1 æé â ã«èšå®ããŸããæå¹æéã®é·ããªãã¬ãã·ã¥ããŒã¯ã³ïŒæ°æ¥ãŸãã¯æ°é±éïŒã䜿çšããŠããŠãŒã¶ãŒã«åèªèšŒãèŠæ±ããã«æ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãååŸããŸãã
åžžã« HTTPS ã䜿çšãã
JWT ã¯ãã€ããŒããæå·åããŸãããããŒã¯ã³ãååãã人ã¯èª°ã§ãå 容ããã³ãŒãããŠèªãããšãã§ããŸããååãé²ããããåžžã« HTTPS çµç±ã§ JWT ãéä¿¡ããŠãã ããã
ãã¹ãŠãæ€èšŒãã
åžžã«çœ²åãæ€èšŒããããŒã¯ã³ãæéåãã§ãªãããšã確èªããaudïŒãªãŒãã£ãšã³ã¹ïŒãã¢ããªã±ãŒã·ã§ã³ãšäžèŽããããšã確èªããäºæããªãã¢ã«ãŽãªãºã ã®ããŒã¯ã³ãæåŠããŠãã ããã
ããŒã¯ã³ãå®å šã«ä¿åãã
ã¯ã©ã€ã¢ã³ãåŽã§ã¯ãå¯èœãªå Žå㯠HTTP-only ã¯ãããŒã« JWT ãä¿åããã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ã§ã¯ã¡ã¢ãªã«ä¿åããŠãã ãããæ©å¯ããŒã¿ãžã®ã¢ã¯ã»ã¹ãæäŸããããŒã¯ã³ã«ã¯ localStorage ãé¿ããŠãã ããã
JWT ã«é¢ãããããã誀解
ãJWT ã¯æå·åãããŠãããã â ããããJWT ã¯çœ²åãããŠãããæå·åã¯ãããŠããŸããããã€ããŒã㯠base64url ãšã³ã³ãŒããããŠãããããã¯å¯éã§ããJWEïŒJSON Web EncryptionïŒã¯æå·åãæäŸããŸãããããã¯æšæºã® JWT ã§ã¯ã«ããŒãããªãå¥ã®ä»æ§ã§ãã
ãJWT 㯠CSRF ãé²ããã â ããåäœã§ã¯é²ããŸãããAuthorization ããããŒå ã® JWT ã¯åœ¹ç«ã¡ãŸãããããŒã¯ã³ãã¯ãããŒå ã«ããå ŽåãCSRF ä¿è·ã¯äŸç¶ãšããŠå¿ èŠã§ãã
ãJWT ã¯èªèšŒå°çšã§ãããã â JWT ã¯èªèšŒã«äœ¿çšãããŸãããèªå¯ããŒã¿ã®äº€æãã¹ããŒããã«ã»ãã·ã§ã³ããµãŒãã¹éã®å®å šãªæ å ±å ±æã«ã䜿çšãããŸãã
JWT ããªã³ã©ã€ã³ã§ãã³ãŒãããŠèª¿ã¹ã
JWT ãã³ãŒããŒããŒã«ã䜿çšããŠãä»»æã® JSON Web Token ãæ€æ»ããŸããããŒã¯ã³ã貌ãä»ãããšããã³ãŒããããããããŒããã€ããŒãã眲åã¢ã«ãŽãªãºã ãå³åº§ã«è¡šç€ºãããŸãããã®ããŒã«ã¯ãããŒã¯ã³ãã©ã®ãããªããŒã¿ãä¿æããŠããããçè§£ããæ£ããæ§é åãããŠããããæ€èšŒããã®ã«åœ¹ç«ã¡ãŸãã