ユーザー認証について
ユーザー認証とは
多くのWebサービスでは、ユーザーごとに異なる機能を提供する。
例えば「ユーザーAは閲覧権限のみで、ユーザーBには閲覧権限に加え更新権限も持つ」といった機能はユーザーごとに異なる機能を提供する一例。
どう実現するか
HTTP はステートレスなプロトコルである。
これはつまり「同じパスへのリクエストには、常に同じレスポンスを返す」という性質を持つということで、「リクエ ストを送ってきたのが誰なのかを判別して、その相手によって異なるレスポンスを返す」というよ うな状態・条件を加味して返答を変化させる機能は本来 HTTP には備わっていない。
その ため「今リクエストを送ってきているのは誰なのかを判定する」機能を実現するために、ID トー クンというものを使ったユーザー認証の仕組みが考えられた。
その ID トークンを使ったユーザー認証で「身元が明らかになったユーザーのみ API を叩くことができる」ような機能を実現することができる。
ユーザー認証の流れ
ユーザー認証は、OpenID Connect という仕組みを使って実現させる。
OpenID Connect は、「どのユーザからリクエストを受けたのか」をIDトークンを通して識別する。これを利用することで SSO を実現することができる。
SSO とは、GooleアカウントやFacebookアカウントなど外部サービスのアカウントを使って「一つのアカウントで、複数のサービスにログイン」する仕組みのこと。
ちなみに「Google」や「Facebook」は OpenID Connect の用語でいうと IDプロバイダと表現される。
JWT
IDトークンは、JWT(Json Web Token)と呼ばれる形式で書かれている。
JWTは、以下の3つの構成要素から成る。
- ヘッダー
- ペイロード
- 署名
ヘッダー部分は、署名部分からトークンの妥当性を検証するために必要な情報が格納されている。
ペイロード部分は、トークンに含ませたい情報(ユーザー名やメールアドレス等ユーザー識別に使う情報)が格納されている。
署名部分は、「base64 エンコードしたヘッダー」と「base64 エンコードしたペイロード」をカンマで繋いだ文字列を用意し、その文字列を、ヘッダーの alg キーで指定されていたアルゴリズムで 「署名する」作業を行い、その結果を base64 エンコードした情報が格納されている。
これらヘッダー、ペイロード、署名はbase64という方式でエンコードされ、URLに付加できる文字列になる。