JWTについて調べた経緯
エンジニア未経験なのですが、現在認証について勉強しており、自身のポートフォリオにJWTなるものを実装してみたので自分の知識の整理も含めて記事を書いてみました。
ただ、正直実装方法については自信がないためコードはお見せせずにJWTについての概念だけ説明してみようかと思います...
JWT(Json Web Token)とは?
JWT(Json Web Token)とは、ユーザーの認証やデータの安全なやり取りを行うためのトークンのことです。
ユーザー認証というのはログインした時にそのユーザー情報を登録して、今ログインしてる人が誰なのかを証明するためのパスポートのような役割をします。
使い方としては以下の通りです。
- ユーザーがログインした時にJWTを発行する
- ブラウザ側でcookieの中にこのtokenを保持しておく(localStorageに入れる方法もある)
- ユーザーがバックエンド側にリクエストを送るときにこのJWTをくっつけて送る
- backend側は秘密鍵を保持しておりこれを使って正当なJWTであるかどうかを検証する
- 問題なければレスポンスが返ってくる
他にもログインユーザーの証明にはsession認証(laravelだとデフォルトでこちらが実装されている)などもありますがこれらの違いはbackend側に認証情報を保持するか、ブラウザ側で保持するかというところで、backendに保持する場合、例えばログインしているユーザーが大量になるとその分backend側の負荷が高まってしまうため、ブラウザ側でクライアント側に管理させることでスケーラビリティを高めることができます。
JWTの構造
JWTはヘッダー、ペイロード、署名の3つから成り立っています。
ヘッダ-にはアルゴリズムという、どういう方式で暗号化するかの明記とトークンのタイプを記載します。
ペイロードにはユーザー情報(usernameとかroleとか)を載せます。漏洩するとまずいような重要な情報は載せてはいけません。
最後は署名です。これはJWTが改竄されたかどうかを見分けるためのものになります。改竄を防ぐというわけではなく改竄されたかを検知することができます。
ただしcookieに入れる場合、JWTだけだと認証としては不十分になります。リクエストの送信時にcookie情報は自動で送信されるため自分でbearerにくっつけるcsrf tokenの実装は必須になります。
laravelでの導入方法
laravelではtymon/jwt-authというパッケージが用意されているようです。
これを導入することでenvに秘密鍵も設定することができます。
最後に
初めて記事を書くのでかなりざっくりしちゃいますが、自分の頭の中の整理ということで多めにみていただけると幸いです...