🔒
認証・認可の概要
最近認証・認可周りを実装する機会があり、その中で色々と調べたので自分なりにまとめたいと思います。
認証と認可の違い
英語だとauthentication(認証)とauthorization(認可)で日本語でも英語でも名前が似ているので、大体同じようなものだろうと思いがちですが概念としては違うものです。
認証
あなたが何者か調べるもの
- パスワード認証
- 指紋認証
- 顔認証
- 電話番号認証
認可
あなたが権限を持っているか調べるもの
- チケット
- 切符
ただ、違うとはいえ割と近い概念なのでTwitterログインのように認証と同時に認可も行うことも多いです。
- Twitterのログイン画面が表示
- IDとパスワードを入力
- 認証と同時に認可
- 本人のアカウントでTwitterに対してポストできる
認証・認可で使われる技術
- トークン
- 使い捨て、一定期間だけ有効なパスワード
- 有効期限が短い認可コード、アクセストークンと有効期限が長いリフレッシュトークンがある
- アクセストークンの期限が切れたらリフレッシュトークンでアクセストークンを再発行するのが一般的
- リフレッシュトークンが切れたらユーザーが再度認可をしてトークンを再発行する
- JWT
- ジョットと読む
- IDトークンの形式で扱われる
- 形式は「ヘッダー + . + ペイロード + . + 署名」
- 以下サイトでJWTについての概要やデバッグ、ライブラリが見れるので便利
- OAuth
- 認可で使用される技術で、認証は扱わない
- 様々なフローがあるが、一般的に以下のようなフロー(認可コードフロー)で認可を行う
- ユーザーに認可画面を表示する
- ユーザーが情報を入力してリクエストを送る
- 認可サーバーが認可コードを発行
- 認可コードからアクセストークンやリフレッシュトークンを発行する
- アクセストークンを利用してリソースにアクセスをする
- OpenID Connect
- OAuthを拡張した技術
- OAuthに認証を足したイメージ
- 認可の際、アクセストークンとともにIDトークンを発行する
- 発行されたIDトークンを使用して認証を行うことができる
- OAuthを拡張した技術
まとめ
これらを抑えておけば、認証・認可について最低限は理解できたと思って大丈夫だと思います。
認証・認可などセキュリティ関連の知識はWebアプリケーションを開発する上でとても重要なものになってくるので、引き続き勉強していきたいです。
Discussion