JWTの概念をざっくり理解する
転職に向けてGoでAPIを構築する勉強をしていてぶち当たったJWTの壁。。。
コーディングしているだけだと何をしているのかさっぱりなので、そもそもJWTってどう言う仕組みなのかを調べてみるとコードの意味も少しずつ理解できるようになってきました。
自分みたいなエンジニア未経験で同じ悩みを持っている人に少しでも参考になれるようまとめてみます、、、!
JWT(JSON Web Token)とは
Goのjwt packageのドキュメントの書き方が個人的に好きだったので引用します。わからなくていいです。
In short, it's a signed JSON object that does something useful (for example, authentication). It's commonly used for Bearer tokens in Oauth 2. A token is made of three parts, separated by .'s. The first two parts are JSON objects, that have been base64url encoded. The last part is the signature, encoded the same way.
一言で言うと、認証とか何か役に立つ署名されたJSONオブジェクトで、Oauth2のBearer
がよく使われるとのことです。"base64urlエンコード"なんかもうさっぱりですね。。。
単語が難しいので理解しにくかったですが、要はAさんが本当にAさんかどうかを確かめるための証明書(トークン)を、誰でもわかりやすい形式(JSON形式)で作る決まり事みたいなイメージだと思ってます。
JWTの構成要素
この証明書であるJWTは以下のように構成されています。
{ヘッダー}.{ペイロード}.{署名}
JWT (JSON Web Token) (in)security
一応簡単にそれぞれ説明すると、、、
- ヘッダー:署名生成に使用したメタ情報(アルゴリズム:HS256など)を含む
- ペイロード:トークンの有効期限などの認証情報を含む(サーバー側で指定)
- 署名:ヘッダーで定義されたアルゴリズムで作成されたトークンを検証するための署名
といった感じです。難しいですが、要は
{隠す方法}.{Aさんの情報や証明書の有効期限など}.{合言葉}
みたいな感じですかね。(ちょっと強引ですが、、、)
JWTの使い所と仕組み
で、どこで使われるのかというと、"JSON Web Token"というくらいなのでWebサイトなんかは代表例ですね。
ユーザー登録しているWebサイトで、ログインしたらしばらくはパスワードなしでサイトを見れるけど、一定時間経つとまたログインしないといけない、少しうざいアレに使われているのがこのJWTなどのトークンです。ペイロードに含まれている有効期限が切れると再度ログインする必要があるということです。
この例で言うと、ログインするときにトークンが生成されユーザーに渡されます。それ以降一定時間はサイトにアクセスするたびにサーバー側が自分のトークンを見て、本人であるかや有効期限が切れていないかなどを確認し、問題なければログインなしでサイトにアクセスできるといった仕組みです。
この時サーバー側では何が行われているかをざっくりまとめます。
トークンの生成
ユーザーがユーザーのIDやパスワードなんかを送ると、それに基づき指定されたアルゴリズムに関するヘッダーと認証情報を含むペイロードを繋いだバイト型のトークンを作成します。
その後、サーバー側で所持している秘密鍵をエンコードしたものをトークンの末尾にピリオドで繋いで文字列のトークンを生成し、ユーザーに返します。
ユーザーは特に何も気づきませんがこれでユーザーにトークンが付与されました。
トークン検証
トークンを持ったユーザーはそれ以降そのサイトにアクセスするたびに、一緒にトークンをサーバーに送ります。
その送られてきたトークンは、サーバー側で秘密鍵を使ってデコードします。
デコードした結果、ペイロードの認証情報が一致し、有効期限が切れていないことが確認できれば、トークンは有効とみなされてユーザーは本人であると認証されると言う感じです。
まとめ
今回はコードはなしで概念だけつまんで説明しました。
現役エンジニアの方に見られると怒られそうなくらいざっくりした内容ですが、JWTがサッパリ!と言う方はこれくらいのイメージを持った状態で色々記事だったり調べてみると少しずつ理解が深まるかと思います。
あとは実際に自分の勉強している言語で実装してみるのが一番です。
私もこれくらいの理解を持った上でGoでJWTを実装してみると、何をしているかを理解しながらコーディングできるようになってきたので、よければ参考程度にでもして頂ければ嬉しいです!
参考
Discussion