このドキュメントについて
- Roadmap.shのバックエンドデベロッパー学習メモです
- 学ぶ前の認証についての認識:
- 認証ってなんだっけ?認可と混同されがちということは聞いたことがあるけど、どっちがどっちなんだっけ?
- 認証関連の用語・技術としてBasic認証とかシングルサインオンとかいろいろあるよなぁ。いまいち整理して理解してないかも
認証と認可
認証
- Webシステムやコンピュータに対してユーザが「ユーザ本人」であることを証明すること
- 例:AさんがWebサービスにログインするとき自分のアカウントID、PWを入力する。PWはAさんとWebサービスだけが知っているので正しいパスワードでログインできるのはAさんだけである
認可
- 「認証」とよく似た言葉に「認可」というものがある
- 「認可」は「認証」されたユーザがとることのできる操作を許可すること
- 例:アカウントID:userAに対して管理画面の操作権限を与えること
つまり
「認証」=だれであるか の証明
「認可」=何ができるか の許可
認証方式
Basic認証
ID、PWによる認証のことではない。
正確にいうと、Basic認証でもIDとPWは用いるが、「ID、PWによる認証」すべてがBasic認証というわけではない。
Basic認証はHTTPの仕様の一部で、RFC 7617で定義されている。
Basic認証ではユーザID、PWをBase64でエンコードしたものをHTTPヘッダのAuthorizationフィールドに記載しサーバーへ送信する
また、ユーザがブラウザを閉じるまで認証情報が有効なので明示的なログアウトができない。
Digest認証
Basic認証の改良版。こちらはRFC 7616で定義されている。
以下の手順で認証情報をハッシュ化することでBasic認証よりもセキュアに認証情報を送信する。
- サーバ:ランダムな文字列を生成し、ID、PWの入力を求める
- クライアント:PWに1で生成されたランダムな文字列を付与し、ID、PWをハッシュ化、サーバへ送信する
- サーバ:クライアントから送信された認証情報とサーバ側で管理しているID、PWおよび1で生成した文字列のハッシュが一致するか検証する
HTTPSによる通信が普及している現在ではベーシック認証でも平文で認証情報を送るリスクは軽減できるので
ダイジェスト認証の重要性は低下している。らしい。
Form認証
HTMLでつくられたフォーム画面からID、PWを入力してに認証する方式。
ブラウザからの入力は通常、平文で送信されるのでHTTPSを用いて通信するのが一般的。
HTTPの仕様にない認証方式のため開発元が自身で実装する必要がある。
逆に言うと独自で実装できるので外部サービスを使った認証や2段階認証、SSO(シングルサインオン)などPW以外の認証方式と組み合わせられる。
Basic認証やDigest認証と異なり、セッション管理をすることで「ログアウト」機能を実装することもできる。
セッション管理
セッションとはログイン~ログアウトまでの一連の操作や通信のこと。
HTTPはステートレスなので複数のリクエストがあったときに、それが一連の操作や通信であるということをサーバ側で判断するには工夫が必要。
(そもそもログイン後にページ遷移したときに、それがさっきログインしたユーザであることをサーバ側でどのように判別したらいいだろうか?ログイン後の通信ではIDやPWは送らないのに)
その工夫がセッション管理。
Cookieによるセッション管理
Cookieによるセッション管理について説明する。
まず、ユーザがWebアプリケーションにログインするとサーバ側では一意なID(セッションID)を発行する。
そしてIDをブラウザのCookieに保存する。
以降、クライアントはこのIDを含むCookieをサーバに送ることで
サーバ側で複数のリクエストが「一連の操作」であることを認識する。
ECサイトを例にとるとセッション管理は以下のような流れになる。
- クライアント:AさんがECサイトにログイン ⇒ サーバ:セッションID(XXX)を発行、Cookieに保存する
- クライアント:Aさんが商品をカートに入れる ⇒ サーバ:セッションID=XXX のユーザのカートに商品を保存する
- クライアント:Aさんが商品を購入する ⇒ サーバ:セッションID=XXX のユーザのカート内の商品の購入処理をする
- クライアント:AさんがECサイトからログアウトする ⇒ サーバ:セッションID(XXX)の情報を破棄する
セッション管理の方法にはCookie以外にURLやフォームの隠し要素にセッションIDを含める方法もあるが
Cookieで管理する方法が主流
また、通常セッションIDには有効期限を設けておく、これによりセッションIDが他者に知られても
一定時間経過後にはログアウトさせられる。
参考
-
Basic認証 Digest認証 Form認証の違い - ITを分かりやすく解説 (medium-company.com)
-
Basic認証とは?仕組みやメリット・デメリット、設定方法について解説|セキュリティのSHIFT (shiftinc.jp)
Roadmap.shにはダイジェスト認証とか出てこなかったけどいろいろ調べてたら芋づるで出てきた。
トークンベース認証やSSO、多要素認証とかは後日。