LoginSignup
1
0

Roadmap.sh学習メモー認証(1)

Posted at

このドキュメントについて

  • 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認証よりもセキュアに認証情報を送信する。

  1. サーバ:ランダムな文字列を生成し、ID、PWの入力を求める
  2. クライアント:PWに1で生成されたランダムな文字列を付与し、ID、PWをハッシュ化、サーバへ送信する
  3. サーバ:クライアントから送信された認証情報とサーバ側で管理している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サイトを例にとるとセッション管理は以下のような流れになる。

  1. クライアント:AさんがECサイトにログイン ⇒ サーバ:セッションID(XXX)を発行、Cookieに保存する
  2. クライアント:Aさんが商品をカートに入れる ⇒ サーバ:セッションID=XXX のユーザのカートに商品を保存する
  3. クライアント:Aさんが商品を購入する ⇒ サーバ:セッションID=XXX のユーザのカート内の商品の購入処理をする
  4. クライアント:AさんがECサイトからログアウトする ⇒ サーバ:セッションID(XXX)の情報を破棄する

セッション管理の方法にはCookie以外にURLやフォームの隠し要素にセッションIDを含める方法もあるが
Cookieで管理する方法が主流

また、通常セッションIDには有効期限を設けておく、これによりセッションIDが他者に知られても
一定時間経過後にはログアウトさせられる。

参考


Roadmap.shにはダイジェスト認証とか出てこなかったけどいろいろ調べてたら芋づるで出てきた。
トークンベース認証やSSO、多要素認証とかは後日。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0