Basic認証とは何ぞや？ ~ざっくりと解説~

# はじめに
HTTP認証の認証方式の一つとして今回は「Basic認証」についてアウトプットしていこうと思います。
# Basic認証の概要
Basic認証とはHTTP認証の枠組みの中にあるいくつかの認証方式のうちの一つになります。
Webサイトにアクセス制限をかける認証方法の1つであり、
httpの機能が持つ認証システムで手軽に制限をかけることができます。

Basic認証はページやファイルなど、特定の領域に制限をかけられる点が特徴であり、
Basic認証で制限されたページにアクセスした際に認証ダイアログが起動し、
ユーザーIDとパスワードの入力を求められます。

登録されたユーザーIDとパスワードを入力すれば認証されるという仕組みになっています。
# 特徴
概要でも軽く触れましたがBasic認証にはいくつか特徴があります。
## 設定方法が比較的に簡易
Basic認証に必要なのは 「**.htaccess**」 ファイルと「**.htpassword**」ファイルだけです。
Webサーバーのディレクトリに上記二つのファイルを追加すれば設定が可能になります。

## ディレクトリ単位で認証設定が可能
基本的にBasic認証はディレクトリ単位で設定が可能です。
「.htaccess」ファイルを置けばそのディレクトリ全体にBasic認証を掛けることができます。

例えば、特定の画像やデータは全員には見られたくない、
ある特定の人にしか閲覧を許したくはないという時にBasic認証はとても便利に働きかけます。
## ほとんどのWebサーバーで設定することが可能
ベーシック認証はWebサーバーの基本的な機能として、
ほとんどのWebサーバーで設定することが可能です。
ただし、レンタルサーバーなど一部無料サービスを利用している場合には、
ベーシック認証を設定する「.htaccess」ファイルを利用することができない可能性があります。

## ブラウザがログイン情報を記憶
一度ベーシック認証で認証に成功してしまえば、ユーザー名とパスワードはブラウザに記憶されます。
再度、入力する手間を省くことができます。
ただし、これはブラウザに依存してしまう機能なので、
ブラウザの種類やバージョンによっては保存されない場合もあります。

また、スマホではBasic認証のログイン情報が保持されないことがほとんどですので、
利用する際のブラウザやデバイスには注意が必要です。
# Basic認証の仕組み
一般的なHTTP認証としてHTTPプロトコルが持っている2つのヘッダーに大きな役割を果しています。
## WWW-Authenticate
```
WWW-Authenticate: <type> realm=<realm>
```
`<type>`：認証方式名。Basicなどが指定される。
`realm`：Basic認証では保護空間(realm)の名前。この名前によって以前に行った認証が有効な範囲かどうかを確認できる。
## Authorization
```
Authorization: <type> <credentials>
```
`<type>`：認証方式名。Basicなどが指定される。
`<credentials>`：ユーザー名とパスワードから生成した認証情報。Base64形式で生成。

Authorizationヘッダーに`type`=Basic、`credentials`にはユーザー名とパスワードを元にBase64形式でエンコードされた資格情報を加えます。

Base64とはデータを英数字64文字と「=」を組み合わせてエンコードする方式の一つです。

https://ja.wikipedia.org/wiki/Base64

### HTTP認証の流れ

それぞれのヘッダーの役割が分かったところでHTTP認証の流れを含めて説明していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641311/24a3ab21-ce25-329d-9317-8fc2fce4556d.png)

1\. クライアントがサーバに対してAuthorizationヘッダーなしにリクエストを送ります。

2\. リクエストした対象に認証が必要な場合サーバはステータスコード401ともにwww-Authenticationヘッダーと共に返して認証が必要な事を知らせます。

3\. クライアントはユーザー名とパスワードから認証情報を生成し、リクエスト中のAuthorizationヘッダーにセットして再度リクエストを送ります。

4\. 入力したユーザー名とパスワードが正しければステータスコード200が帰ってきます。  

## サーバでの設定方法
Basic認証はサーバーの認証をかけたいフォルダに「.htaccess」「.htpasswd」という2つのファイルを作成し、それぞれに決まったコードを記述するだけで設定できます。

ファイルはメモ帳などで良くて特別なツールは必要ありません。
上記のヘッダ内に記載したIDやパスワードと照合し、ログイン情報が一致していればアクセスが許可され、
不一致ならもちろんアクセスは拒否されるため、ユーザーはファイルにアクセスできません。認証の許可もしくは拒否という仕組みが成立しています。
# Basic認証のデメリット
Basic認証の特徴がメリットみたいなものなのでここではデメリットをご紹介します。

## セキュアではない
Basic認証はセキュアな認証とは言い切れません。
理由の一つとしてBasic認証ではログイン情報を入力して送信する際に
「Base64」という文字コードを用いて通信を行います。
「Base64」は簡易的な通信を行う際の文字コードで英数字と特定の記号のみの64文字で利用可能です。
つまり、Basic認証で入力したログイン情報は、「Base64」の文字コードで表現できる英数字と特定の記号で通信されてしまいます。

もし、Basic認証をかけたWebページが「https」ではなく、「http」通信である場合、
外部からログイン情報が盗聴されてしまうため注意が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641311/7b769ead-e742-47ab-1258-712abebd1415.png)
## クローラーがアクセスできない
Basic認証を設定すると、その領域には検索エンジンなどのクローラーもアクセスすることができません。
クローラーとは、インターネット上に存在するWebサイトや画像などの情報を取得し、
自動的に検索データベースを作成する巡回プログラムのことです。
クローラーが来ないということはつまり、GoogleやYahoo!などで検索してもベーシック認証を設定した領域は検索結果に表示されなくなるということです。

## サーバーを跨いだ設定ができない
Basic認証を設定できる範囲は「.htaccess」ファイルのを設置したディレクトリのみが対象です。
ディレクトリを超えた範囲、例えばサーバーをまたいで同じBasic認証を設定することはできません。
# おわりに
本日は「Basic認証」についてこのブログ記事にてアウトプットしていきました。
改めてHTTPプロトコルの基礎的な部分を学習できて理解が深まりました。
今後もいくつかの認証方式を学習してアウトプットしていこうと思います。

## 参考
https://developer.mozilla.org/ja/docs/Web/HTTP/Authentication

https://www.cybersolutions.co.jp/blog/basic/

https://www.itra.co.jp/webmedia/basic_authentication.html

https://atmarkit.itmedia.co.jp/ait/articles/1608/10/news021_2.html