JWTを取り巻く多くの一般的な誤解があります。たとえば、そのうちの1つは、JWTが暗号化されていることです(実際には、base64urlでのみ署名およびエンコードされています)。実際には、JWTに1つのセッション識別子しか格納されていない場合(実際、セッションを操作する場合はJWTは必要ありません)、かなり奇妙な解決策に出くわすことがよくあります。または、JWTは1つのユーザーIDのみを格納し、そのプロファイルはデータベースからの各要求で要求されます(実際、データベースへの要求の数を減らしたい場合、JWTは理にかなっています)。または、さらに奇妙なことに、JWT自体がデータベースに保存されます。
JWTの役割と場所に関するこの誤解の客観的な理由の1つは、JWT仕様がJWT形式を記述しており、JWTの適用方法について何も述べていないことです。
これについて書きたいという願望は長い間生じてきました。そして、JWTの少し奇妙な使用法で別のプロジェクトを見た後、私はまだ決めました。
最も重要な謎解きから始めましょう。JWTは次のようになります。
eyJhbGciOiJSUzI1NiJ9.eyJpcCI6IjE3Mi4yMS4wLjUiLCJqdGkiOiIwNzlkZDMwMGFiODRlM2MzNGJjNWVkMTlkMjg1ZmRmZWEzNWJjYzExMmYxNDJiNmQ5M2Y3YmIxZWFmZTY4MmY1IiwiZXhwIjoxNjA3NTE0NjgxLCJjb3VudCI6MiwidHRsIjoxMH0.gH7dPMvf2TQaZ5uKVcm7DF4glIQNP01Dys7ADgsd6xcxOjpZ7yGhrgd3rMTHKbFyTOf9_EB5NEtNrtgaIsWTtCd3yWq21JhzbmoVXldJKDxjF841Qm4T6JfSth4vvDF5Ex56p7jgL3rkqk6WQCFigwwO2EJfc2ITWh3zO5CG05LWlCEOIJvJErZMwjt9EhmmGlj9B6hSsEGucCm6EDHVlof6DHsvbN2LM3Z9CyiCLNkGNViqr-jkDKbn8UwIuapJOrAT_dumeCWD1RYDL-WNHObaD3owX4iqwHss2yOFrUfdEynahX3jgzHrC36XSRZeEqmRnHZliczz99KeiuHfc56EF11AoxH-3ytOB1sMivj9LID-JV3ihaUj-cDwbPqiaFv0sL-pFVZ9d9KVUBRrkkrwTLVErFVx9UH9mHmIRiO3wdcimBrKpkMIZDTcU9ukAyaYbBlqYVEoTIGpom29u17-b05wY3y12lCA2n4ZqOceYiw3kyd46IYTGeiNmouG5Rb5ld1HJzyqsNDQJhwdibCImdCGhRuKQCa6aANIqFXM-XSvABpzhr1UmxDijzs30ei3AD8tAzkYe2cVhv3AyG63AcFybjFOU8cvchxZ97jCV32jYy6PFphajjHkq1JuZYjEY6kj7L-tBAFUUtjNiy_e0QSSu5ykJaimBsNzYFQ
base64urlでデコードすると、「秘密」の神話はすぐに破壊されます。
{"alg":"RS256"}{"ip":"172.21.0.5","jti":"079dd300ab84e3c34bc5ed19d285fdfea35bcc112f142b6d93f7bb1eafe682f5","exp":1607514681,"count":2,"ttl":10} O2Mrn%!OPzN{hk11l\9Mkd Z&ۚWJP%^DǞ8*Xև|!䵥C&D0Di?Ak nue7bݟB 6AV*9)S.jNv `EcG9ތ*6kQDv_xzߥEdgbs<wP(Ӂ"?K ?WxiHp<>,/EU]T䒼-Q+\}PfbuȦ 7�ɦZTJ jhonӜ-v 6j9ǘ :!z#fEewQ*44 bl"&t!F �*s>]+U&8z-@Fap2p\S܇}0hˣŦy*ԛb1H/A�U3bA$) j)
中括弧の最初の部分はJOSEヘッダーと呼ばれ、https: //tools.ietf.org/html/rfc7515で説明されています。フィールドが含まれる場合があり、その中で最も重要なアルゴリズムです。{"alg": "none"}を設定した場合、トークンは署名なしで有効と見なされます。したがって、APIには、署名なしで手動で生成されたトークンを持っている人なら誰でもアクセスできます。現在、ほとんどのライブラリはデフォルトでそのようなトークンを拒否しますが、念のためAPIを確認してください。
— . , , , jti — exp — . , JWT — .
, , . . , ( ). , , JWT.
JWT — JSON, .
"" , , JWT. ( - — ).
. ( , "" ) , , .
. , . "" API . JWT , — JWT .
, JWT — , , - , .
, , JWT . ( Redis) . — , .
. JWT , JWT ( )? , "-" . "-" .
"-" . "-" , . , , , - .
「条件付き」トークンのキャンセルには、かなり興味深い問題が1つあります。それらが無期限にリリースされた場合、キャンセルの場合、それらも無期限に保存する必要があります。それらを一定期間解放すると、トークンの有効期間中にAPIの呼び出しがない場合、「永遠の」セッションからログアウトが発生します。
apapacy@gmail.com2020年
12月9日