普段から何気なくBasic認証を導入することがあると思うが、
「そういえば、一度認証されたという情報はどうやって保持しているんだろう?」
というのが気になったので、ちょっと調べてみた。検証したApacheのバージョンは2.2系。
一度Basic認証をパスすると、ブラウザはRequest Headersにauthorizationという項目を都度送信するようになる
結論を先に書くと、ブラウザがBasic認証を通過した際の認証情報を保持するからだ。仕組みは下記の通り:
- 一度対象ページのBasic認証をパスすると、ブラウザ側はその認証に必要な情報を保持する
- 次に同一ページへアクセスした際、ブラウザはBasic認証の認証情報をauthorizationという項目で、リクエストヘッダーに付与させた上でアクセスする
- Apache側がリクエストヘッダー側から受け取った認証情報を照合、OKなら認証なしでレスポンスを返す
↑認証後のリクエストヘッダー情報。authorizationという項目が付与されているのがわかる
authorizationの項目には’Basic’の後にbase64エンコードされた認証情報が格納されている。もし認証方法を知りたければUNIXコマンドで
1 |
echo -n 'XXXXXXXXXXXXXXXX==' | base64 -D |
というようにデコードしてあげれば確認することが可能。
余談:Realmについて
Basic認証はApacheのhttpd.conf等で特定のディレクトリに対して設定することがほとんどだと思うが、その際にRealm(レルムと読む)という概念がある。聞きなれない言葉だがRealmは”領域“を意味する言葉で、Apacheでは特定のディレクトリに適用する領域名をAuthNameという項目で設定することができる。
ApacheはRealmを活用して、
アクセスしてきたリクエストがBasic認証がかかっているディレクトリだった場合、この領域情報と認証ダイアログをクライアントサイドに提示することで、クライアント側は一度認証をパスした時にどの領域に対する認証情報なのかを一緒に保持することができる
という仕組みでBasic認証を適用しているらしい。
参考)
https://httpd.apache.org/docs/2.2/ja/howto/auth.html
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Authorization