新人プログラマーの軌跡　#7　Basic認証と.htaccess　

最近の作業でテストサイトの構築をしていた時に、Basic認証が必要になりました。
今まではサーバーのコンパネから作成していたのですが、
今回からはちゃんと記述が出来るようにとBasic認証について調べましたので、整理しておきます。
またBasic認証のついでに.htaccessも調べることになりましたので、そちらのほうも。
まあ整理とは言いつつも羅列気味なのはご勘弁を・・・

#Basic認証
##Basic認証で出来る事
ウェブ上において簡単なユーザ認証が可能。認証を通るにはID・PASSが必要となります。

##性質
- ウェブサーバの設定が記述された「.htaccess」ファイルと認証用のID・PASSが記述された「.htpasswd」が必要となります。
- .htpasswdはファイル名の規定がない。自由だが分かりやすいように変えないことが多い。
- .htpasswdの設置場所は.htaccessと同じである必要はない。
- 暗号化されたパスワードは毎回異なる。使用する暗号化キーが異なるため。

##記述方法
###.htaccessの記述
```
AuthType Basic
AuthName Protected Area
AuthUserFile /usr/home/hoge/fuga/.htpasswd
require valid-user
```
一行目から見ていきます。

- AuthType　認証方法：BasicとDigestがある。
    - Basic　ID・PASSをbase64でエンコードしたものを、そのままの状態で通信をしている。ID・PASSがほぼ生の状態で存在しており、盗みや改ざんにあう可能性がある。
    - Digest　ID・PASSをMD5でhash化している。そのためにBasicよりも安全。ただ時間をかければ解析される。

- AuthName　認証の領域名：日本語でも記載可能だが、文字化けの可能性があるので避ける。
- AuthUserFile　ID・PASSを格納したファイルの場所をサーバー内のフルパスで記述する。サーバーによっては``/usr/home/``の部分は変わわる。
- require valid-user　上記を満たすユーザは全て認証を通ることが出来る。


###.htpasswdの記述
.htpasswdは
``ID:PASSの暗号化``
といった形式で記述される。

ちなみにIDとPASSを打ち込んで暗号化されたPASSを表示するサイトがある。
ex.[基本認証用パスワード暗号化](http://www.nishishi.com/scripts/htpasswd/)

　　　
初めはBasic認証を調べていましたが、.htaccessにはこの認証以外に他のことも出来ることが分かったので
次は.htaccessについて見ていこうと思います。

#.htaccess
##.htaccessで出来る事
- リダイレクトが可能。
- 401や404エラーが出た場合に独自のページに置き換えることが可能。



##性質
- .htaccessが 上位・下位に設置されている場合は、両方の内容が適用される。また競合する場合は下位の内容が優先される。
- Apacheで利用できるため、他のソフトウェアでは利用できない。
- 認証に失敗すると401エラーが出る。
- ``DrirectoryIndex home.php``
とするとindex.htmlではなく、home.phpが表示される。また表示するファイルを半角スペースで区切って複数選択することで上位から優先的に表示することが出来る。
- 指定したファイルにアクセス制限をかけることが可能。

```
<Files ~ "^.ht">
 deny from all
</Files>
```
を記述することで、全ユーザに対し「.ht」で始まるファイルへのアクセスを拒否することが可能。
また

```
<Files ~ "^.ht">
order deny,allow
deny from all
allow from [IPアドレス]
</Files>
```

とすることで、deny→allowの順序で解釈し(2行目)、指定したIPアドレスを持つユーザは.htaccessを見ることが出来る(4行目)ようになる。
※プライベートIPアドレスとグローバルIPアドレスは異なるので注意


- リダイレクトにはアクセス時に瞬時に切り替わるものと、数秒後に切り替わるものの2種類ある。ちなみに.htaccessを用いずに、metaタグやJavaScriptを用いる方法もある。
- 瞬時に切り替わるものは転送元のURLが履歴に残らない。
- リダイレクトを設定することが出来る方法が２つある。

####Redirectを使用
permanentは恒久的な移動、tempは一時的な移動に用いる。
 
```
Redirect permanent [転送元] [転送先]
Redirect temp [転送元] [転送先]
```

####mod_rewriteを使用
上記のリダイレクトよりも詳細な設定をすることが出来る。ただし、サーバの拡張機能なので使えないサーバもある。
 
```
RewriteEngine on
RewriteCond %{HTTP_HOST} ^hoge\.com
RewriteRule ^(.*)$ http://www.hoge.com/$1 [R=301,L]

```
一行目　mod_rewriteの有効化
二行目　リクエストしたホストがhoge\.comならば三行目に進む。%{ }は環境変数のHTTP_HOSTにつける必要があります。
三行目　http\://www\.hoge.com/を付加する。R=301は301リダイレクトを指定。無指示では302リダイレクトをする。LはLastの意味でこの操作が終わると下記に続く操作は無視される。


- .htmlファイルを.phpファイルとして扱うことが出来る。(下の例はサーバがCPIの時。サーバの種類によっては記述方法が変わる。)

```
AddHandler x-httpd-php[version] .php .html
```


#注意
「.htaccess」・「.htpasswd」を作成する際に注意すべきポイントがあり、一つでも間違っていると正常に動きません。
そこで、その注意点を見ていきます。

拡張子はないが、拡張子を表示しないように設定されている場合は、「.」で始まるファイル名にしても余計な拡張子が付加されている可能性がある。

###500エラー時のチェック項目
.htaccessをサーバにあげたものの、500エラーが出てしまうことがあります。
その時に意識している点を挙げていきます。

- [ ] スペルミス
- [ ] スペースミス　全角スペースは使えない。
- [ ] テキスト形式　リッチテキスト形式はだめ。
- [ ] UTF-8はBOMなしで。　defaultでBOMなしのUTF-8Nという文字コードもある。
- [ ] 改行コード
- [ ] 最後に空行が入っているか。





#まとめ
basic認証は簡易的なユーザ認証方法であり、セキュリティを考慮するとsshなどと組み合わせるべきようです。
使用方法によってはbasic認証で十分なのでしょうが。
また.htaccessはBasic認証を使う道具だ、くらいに思っていましたが想像以上に様々なことが出来ることが分かりました。
大切なものなんだと。