Real World HTTPの2章2.6認証とセッションを読んだ

認証とセッション

ユーザ名とパスワードを毎回クライアントから送る方式

BASIC認証

  • ユーザ名とパスワードをbase64エンコーディングしたもの
  • 可逆変換なのでサーバーで復元した値をDBと比較して正しいユーザかどうか検証できる
  • SSL/TLS通信を使っていない状態で通信を傍受されると通信内容から簡単にユーザ名とパスワードが漏洩してしまう

Digest認証

  • BASIC認証より強固な認証方式で、ハッシュ関数を利用する
  • まず、ブラウザが保護された領域にアクセスしようとすると、401 Unauthorizedというステータスコードでレスポンスが返ってくる
  • その際にレスポンスに付与されたヘッダー情報などから計算で求めた値をヘッダーに付け加えて再度リクエストを送信する
  • サービス側でもサービスの内部に保存されているユーザ名とパスワードを使って計算を行い、同じ値が計算できた場合に認証が成立する
  • これにより、ユーザ名とパスワードそのものをリクエストに含めなくてもサーバ側でユーザを正しく認証できるようになる

クッキーを使ったセッション管理

BASIC認証もDigest認証も今ではあまり使われていない

なぜあまり使われていないのか?

  • 特定のフォルダ以下を「見せない」という使い方しかできず、トップページにユーザ固有の情報を出すような使い方ができない
  • リクエスト毎にユーザ名とパスワードを送信し、計算をして認証する必要がある
  • 明示的なログアウトができない
  • ログインした端末の識別ができない

よく使われるフォームを使ったログインとクッキーを使ったセッション管理の組み合わせ

  • クライアントは最初のログインの際にIDとパスワードを送信する(なのでSSL/TLS必須)
  • サーバ側でユーザIDとパスワードを認証し、問題なければセッショントークンを発行する
  • サーバはセッショントークンをRDBやキーバリュー型のデータベースに保存しておく
  • トークンはクッキーとしてクライアントに戻され、2度目以降のアクセスではクッキーを再送することでログイン済みのクラアントであることがサーバにわかる