Chrome79以降からは、ステータスコード401を返すページにBasic認証を設定するとアクセスできなくなる

2020-01-12Web

はじめに

今までBasic認証をかけていて閲覧はできていたページが、Chrome79から急に閲覧できなくなるという問題が発生しました。

StackOverflowやTwitterなどを調べてみてもそのような問題で悩んでいる方はいません。

ちなみに対象のページはやや特殊で、Basic認証をかける以前から、サービスにログインせずにアクセスした場合は ステータスコード = 401 を返却しつつ、ページコンテンツを返却します。

Chromium のソースコードを読んでみましたが、なかなかリーディングができず。(これは僕のスキルの問題です)

そこで実際に問題を再現させた後、「原因」の調査と「対策」を検討してみました。

検証環境

サーバサイド

$ apachectl -v
Server version: Apache/2.4.38 (Debian)
Server built:   2019-08-18T13:34:20

$ php -v
PHP 7.2.23 (cli) (built: Oct  5 2019 00:23:19) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

クライアントサイド

プラットフォーム

PC

ブラウザ

2020-01-08現在、確認した環境は以下の2つです。 version 81Chrome Canary を利用しました。

  • Version 79.0.3945.88 (Official Build) (64-bit) ( Chrome )
  • Version 81.0.4020.0 (Official Build) canary (64-bit) ( Chrome Canary )

*※いずれの環境でも問題が発生することを確認済みです。

検証環境の用意

まずはサーバ環境を構築します。

Docker を使って Apache+PHP の実行環境を構築します。

  • カレントディレクトリのファイルをDocuemntRootにマウントさせます
  • http://localhost:9000 でアクセスできるようにしておきます。
$ docker run -d \
  --rm -p 9000:80 -v $PWD:/var/www/html \
  --name apache php:7.2-apache

次に該当ページの作成とBasic認証の設定を行います。

# 該当ページ。常にレスポンスコード=401とコンテンツを返す
$ cat <<EOF >index.php
<?php
header('HTTP/1.1 401 Unauthorized');
?>
<html>
     <head></head>
     <body>
          <h1>ログイン後しかアクセスできないページ</h1>
          ログイン後に来てね!
     </body>
</html>
EOF

# Basic認証の設定
$ cat <<EOF >.htaccess
AuthType Basic
AuthName "Please enter username and password"
AuthUserFile /var/www/html/.htpasswd
require valid-user
EOF

# Basic認証のパスワード設定ファイルを作成
$ htpasswd -c .htpasswd admin
New password:
Re-type new password:
Adding password for user admin

最終的に3ファイル作成されます。

$ ls -a
./  ../  .htaccess  .htpasswd  index.php

ブラウザでアクセスしてみる

それではブラウザでアクセスしてみましょう。

Chrome79 以降でアクセスすると、 Basic認証 ダイアログが表示されます。
Basic認証 で正しいユーザ、パスワードを入力しても、ページは真っ白のままとなります。

ところが FirefoxSafari でアクセスすると Basic認証 突破後にページが表示されます。

Basic認証の認証済みステータスがリセットされる

HTTP RESPONSE CODE = 401 が返却されると、Basic認証の認証済みステータスがリセットされるようです。

対策

どうしても Basic認証Digest認証を含む ) を設定したい場合、 レスポンスコード = 401 を返却するようなページはつくらない、ということになるかと思います。

あるいは利用者が限定される場合は、Chrome以外のブラウザを利用してもらうことで対処できるかと思います。

2020-01-12Web