最終曎新:

【仕組み解説】JWTはどうやっおナヌザヌ認蚌を実珟しおいるのか — トヌクンの䞭身を図解


JWTの構造ず眲名怜蚌 Header "alg": "HS256" "typ": "JWT" . Payload "sub": "user123" "exp": 1706200000 . Signature HMACSHA256( header+payload, secret) ※ Header・PayloadはBase64URL゚ンコヌド暗号化ではない 眲名怜蚌の流れ クラむアント JWT送信 サヌバヌ 怜蚌 Secret鍵で 眲名を再蚈算 䞀臎 → 認蚌OK トヌクンは正芏のもの 䞍䞀臎 → 拒吊 改ざんの可胜性あり
JWTの3パヌト構造ず眲名怜蚌の流れ
ひよこ ひよこ

ログむンしたあずに「トヌクン」っおもらうらしいけど、あれっお䜕なの

ペンギン先生 ペンギン先生

それがたさにJWTJSON Web Tokenだよ。ログむンに成功するず、サヌバヌが「この人は本人確認枈みです」ずいう情報をギュッず詰め蟌んだ文字列を発行するんだ。次回以降のリク゚ストでは、このトヌクンを提瀺するだけで「あ、さっきログむンした人だね」ず分かる仕組みだよ。

ひよこ ひよこ

文字列の䞭に情報が入っおるの芋た目はランダムな文字の矅列に芋えるけど 

ペンギン先生 ペンギン先生

実はJWTは3぀のパヌトがドット.で区切られた構造になっおいるんだ。「Header.Payload.Signature」の3぀だね。Headerにはアルゎリズムずトヌクンのタむプ、Payloadにはナヌザヌ情報や有効期限、Signatureには改ざん怜知甚の眲名が入っおいるよ。

ひよこ ひよこ

えっ、ナヌザヌ情報がそのたた入っおるのそれっお危なくないの

ペンギン先生 ペンギン先生

いい質問だね。HeaderずPayloadはBase64゚ンコヌドされおいるだけで、暗号化はされおいないんだ。぀たりデコヌドすれば䞭身は誰でも読める。だからパスワヌドやクレゞットカヌド番号のような機密情報は絶察に入れちゃダメだよ。入れるのはナヌザヌIDや暩限レベルなど、読たれおも臎呜的でない情報に限るんだ。

ひよこ ひよこ

じゃあ眲名Signatureのほうは䜕をしおるの

ペンギン先生 ペンギン先生

眲名は「このトヌクンは改ざんされおいたせん」を保蚌する郚分だよ。サヌバヌだけが知っおいる秘密鍵Secretを䜿っお、HeaderずPayloadをハッシュ化しお䜜るんだ。もし誰かがPayloadの䞭身を曞き換えたら、眲名ず䞀臎しなくなるから「これは停物だ」ずすぐバレる仕組みだね。

ひよこ ひよこ

なるほどでも、昔ながらのセッションIDずは䜕が違うの

ペンギン先生 ペンギン先生

䞀番倧きな違いは「ステヌトレス」かどうかだよ。セッション方匏だずサヌバヌ偎にセッション情報を保存する必芁がある。でもJWTはトヌクン自䜓に情報が入っおいるから、サヌバヌは䜕も芚えおおかなくおいい。だから耇数サヌバヌに分散しやすくお、マむクロサヌビスやAPI認蚌でよく䜿われるんだ。

ひよこ ひよこ

トヌクンに有効期限があるっお蚀っおたけど、期限が切れたらどうなるの

ペンギン先生 ペンギン先生

有効期限expが切れたトヌクンは拒吊されるよ。でも毎回ログむンし盎すのは面倒だよね。そこで「リフレッシュトヌクン」ずいう仕組みを䜵甚するんだ。アクセストヌクンは15分〜1時間くらいの短い有効期限にしお、リフレッシュトヌクンで新しいアクセストヌクンを発行しおもらう。こうするこずで、䞇が䞀トヌクンが挏れおも被害を最小限にできるよ。

ひよこ ひよこ

セキュリティで気を぀けるこずっお他にもあるの

ペンギン先生 ペンギン先生

有名な攻撃に「alg none攻撃」ずいうのがあるよ。Headerのアルゎリズムを「none」に曞き換えお、眲名なしのトヌクンを受け入れさせるずいう手口だ。叀いラむブラリだずこれが通っおしたうこずがあったんだ。察策ずしおは、サヌバヌ偎で蚱可するアルゎリズムをホワむトリストで厳栌に指定するこず。あずは秘密鍵Secretの管理も超重芁で、挏掩したらすべおのトヌクンが停造可胜になるから、環境倉数で管理しおリポゞトリには絶察にコミットしないこずだね。

ひよこ ひよこ

OAuth2っおいうのずJWTは関係あるの

ペンギン先生 ペンギン先生

OAuth2は「認可の仕組み」で、JWTは「トヌクンのフォヌマット」だよ。OAuth2のアクセストヌクンずしおJWTが䜿われるこずが倚いんだ。GoogleやGitHubのログむンで「〇〇でサむンむン」っおやるずき、裏偎ではOAuth2のフロヌが走っお、最終的にJWT圢匏のトヌクンが発行されるこずが倚いよ。぀たり、OAuth2が「どうやっお暩限を委譲するか」を決めお、JWTが「その蚌明曞をどういう圢で枡すか」を決めおいる関係だね。

ひよこ ひよこ

JWTっお䞇胜に芋えるけど、デメリットもあるのかな

ペンギン先生 ペンギン先生

もちろんあるよ。䞀番のデメリットは「発行枈みトヌクンを無効化しにくい」こずだね。セッション方匏ならサヌバヌ偎でセッションを消せばログアりトできるけど、JWTは有効期限が来るたで有効なたたなんだ。匷制ログアりトしたい堎合はブラックリスト方匏やトヌクンバヌゞョニングずいった远加の仕組みが必芁になる。結局、完党にステヌトレスではなくなっおしたうんだね。甚途に応じおセッション方匏ずJWTを䜿い分けるのがベテラン゚ンゞニアの刀断力だよ。