はじめに
今までユーザーとしてなにげなく利用していた認証について、ユーザー認証を伴うAPIをLaravelで開発をするために学ぶ機会がありました。認証については、なんとなくそれっぽい認証風なものであったり、ライブラリを雰囲気で利用していただけでした。
この機会に認証のJWT認証について、抽象的なレベルでも理解できればと思いまとめてみます。
初学者としての知識の範囲内による理解をまとめた記事ですので、間違いなどがあるかもしれませんので、ご指摘いただければ幸いです。
JWTとは
- JSON Web Token(JWT)
- JWTは、HTTPヘッダーにクエリパラメータなどの付加情報(ペイロード)を載せられるように
- JSONデータをURLセーフする方法を規定したもの => JSONデータをBASE64URLエンコードする
- JSONデータをコンパクトにする方法を規定したもの => よく使用されるデータ項目を略称にして、JSONキーを短くするこれによってJSONデータをコンパクトにする
- Claim(クレーム)
JWTではJSONのデータ項目(キーと値のペア)をClaim(クレーム)と呼ぶ
このようにクレームとして定義された情報をエンコードしてデータを小さくして、HTTPヘッダーやクエリパラメータへ載せられるようにする。
JWSとは
JWTはBASE64URLエンコードされているだけなため、セキュリティ面ではなにも担保されていない
BASE64URLデコードすればすぐにもとのデータ形式に戻すことができるし、改ざんも可能
この改ざんを防止(改ざんを検知する仕組み)する手段がJWS
JWSは改ざん自体を防ぐものではなく、改ざんされたJWSどうかを検知することができる
JWSの仕組み
- HTTPヘッダーとペイロード(ヘッダーに載せたいデータ)をBASE64URLでエンコードする
- 1のエンコードしたものを.でくっつける
- 2の結果を暗号鍵とヘッダーのalgに指定された方式で暗号化して、BASE64URLでエンコードする
- 2と3の結果を.でくっつける
- エンコードされたヘッダー.エンコードされたペイロード.エンコードされた暗号鍵とヘッダーのalgに応じて暗号化された前二つの情報(トークン)
JWSの検証
JWSの仕組み上、前の二つの情報はBASE64URlでエンコードされているだけなため、情報を確認することは簡単
改ざん自体も可能。しかし3番目の情報に関しては不可能
- 暗号鍵は信頼している相手しか持っていない
- 暗号化した内容は同じ暗号鍵を持っていなければ復号化できる
上記の2点から信頼した相手からのJWSであれば、復号化した情報の内容が改ざんされていないことになる。
まとめ
今回JWTについて表面的ですが、まなぶことで認証情報に対してどのように開発をするのか?ということを考える幅が広がり、思考が点ではなく線として進められる感覚が増えました。
知識が増えることで、開発の視野を広げられる感覚が開発の楽しさを感じさせてくれるなと実感しました。