[1] [[HTTP]] の[DFN[基本 ([CODE(HTTP)[[[Basic]]]]) 認証]]は、[[利用者名]]と[[合言葉]]を使った、 とても基本的な[[認証]]方式です。 * 仕様書 [REFS[ - [26] [CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) ]REFS] * [CODE(HTTP)@en[auth-scheme]] [2] [[基本認証]]を表す [CODE(HTTP)@en[[[auth-scheme]]]] は [DFN[[CODE(HTTP)[[[Basic]]]]]] です。 * 誰何 [8] [[基本認証]]では [CODE(HTTP)@en[[[realm]]]] 以外の [CODE(ABNF)@en[[[auth-param]]]] は使いません。 [SRC[>>3, >>18]] ** [CODE(HTTP)@en[realm]] [6] [[基本認証]]における [CODE(HTTP)@en[[[realm]]]] は、[[不透明]]な文字列として扱うべきものであり、 同じ[[鯖]]の別の [CODE(HTTP)@en[[[realm]]]] と[RUBYB[等しさ]@en[equality]]の比較のみができます。 [SRC[>>3, >>18]] * credentials [15] [[基本認証]]の [[credentials]] は[[歴史的経緯]]により他の [[auth-scheme]] とは違う独自の構文になっています。 [16] [[利用者]]IDと[[合言葉]]を [CODE(char)[[[:]]]] で連結し、それを [[Base64]] した文字列を [[credentials]] として使います。 [FIG[ [FIGCAPTION[ [19] [[RFC 2068]] における [CODE(HTTP)@en[[[Basic]]]] 認証の [[credentials]] の構文 ]FIGCAPTION] [PRE(ABNF code)[ basic-credentials = "Basic" SP basic-cookie basic-cookie = user-pass = userid ":" password userid = * password = *TEXT ]PRE] ;; [28] [[RFC 2617]] の定義もこれと等価です。 ]FIG] [FIG[ [FIGCAPTION[ [11] [[RFC 1945]] における [CODE(HTTP)@en[[[Basic]]]] 認証の [[credentials]] の構文 ]FIGCAPTION] [PRE(ABNF code)[ basic-credentials = "Basic" SP basic-cookie basic-cookie = userid-password = [ token ] ":" *TEXT ]PRE] ]FIG] [17] [[ABNF]] 構文上[[利用者]]IDと[[合言葉]]は [[HTTP]] の [[TEXT]] に制限されていますが、実際には[[鯖]]の既存のシステムの認証システムが流用されていることもしばしばあり、 [[非ASCII文字]]が含まれることもあります。 ;; [20] [[RFC 1945]] の定義では[[利用者]]IDは [[HTTP]] の [[token]] で、更に制限されていました。 [21] [[利用者]]ID は[[大文字・小文字不区別]]かもしれません。[SRC[>>18]] [22] [[合言葉]]は[[大文字・小文字不区別]]かもしれません。 ;; [23] [[大文字]]・[[小文字]]その他の値の[[正規化]]の有無は[[起源鯖]]の実装や設定に依存します。 * 鯖の処理モデル [7] [[鯖]]は、指定された[[利用者]] ID と[[合言葉]]が当該 [[Request-URI]] の保護空間において妥当であると確認できる場合のみ、[[要求]]を[[認証]]します。 [EG[ [9] [[認証]]できない[[要求]]に対して[[鯖]]は [PRE(HTTP code)[ WWW-Authenticate: Basic realm="WallyWorld" ]PRE] ... のように [CODE(HTTP)@en[[[realm]]]] を指定した [CODE(HTTP)@en[[[WWW-Authenticate:]]]] 欄を送ります。この [CODE(HTTP)@en[[[realm]]]] が当該 [[Request-URI]] に対応する保護空間を表します。 ]EG] * 利用者エージェントの処理モデル [10] [[利用者エージェント]]は[[利用者]]IDと[[合言葉]]を [[credentials]] に含めて、 [CODE(HTTP)@en[[[Authorization:]]]] 欄として送信します。 [EG[ [12] [[利用者]]ID が [CODE[Aladdin]] で[[合言葉]]が [CODE[open sesame]] であるとすると、 [CODE(HTTP)@en[[[Authorization:]]]] 欄は [PRE(HTTP code)[ Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== ]PRE] ... となります [SRC[>>3]]。 ]EG] [29] [[利用者エージェント]]は、 [[Request-URI]] の [[path]] の最後の symbolic element と同じ、またはそれ以深の [[path]] はすべて同じ保護空間内にあるものと仮定する[['''べきです''']]。 [[誰何]]を明示的に確認することなく [CODE(HTTP)@en[[[Authorization:]]]] を送って[['''構いません''']]。 [SRC[>>26]] ;; [30] 「symbolic element」とは何か説明がありませんが、[[ディレクトリー]]階層のことを言っているのでしょう。 [31] 同様に[[串]]の認証については、[[誰何]]を明示的に確認することなく [CODE(HTTP)@en[[[Proxy-Authorization:]]]] を送って構いません。 [SRC[>>26]] * 安全性 [13] [[基本認証]]は[[利用者]]のIDと[[合言葉]]を[[平文]]で送信するので、 安全でない[[通信路]]でやり取りする[['''べきではありません''']] [SRC[>>24, >>32]]。 [[Base64]] によって事故により[[合言葉]]を傍聴されることは防げますが、 悪意を持って[[合言葉]]や [[credentials]] を盗もうとするものには対抗できません。 [14] 実装によっては [[HTTPS]] でない [[HTTP]] で[[基本認証]]に対応していません。 [25] しかし非常に手軽な認証方式であることから、現在でもよく用いられています。 * 歴史 ** RFC [REFS[ - [3] [CITE@en[RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0]] ([TIME[2012-02-18 23:25:56 +09:00]] 版) - [18] [CITE@en[RFC 2068 - Hypertext Transfer Protocol -- HTTP/1.1]] ([TIME[2012-02-18 23:30:14 +09:00]] 版) - [24] [CITE@en[RFC 2068 - Hypertext Transfer Protocol -- HTTP/1.1]] ([TIME[2012-02-18 23:30:14 +09:00]] 版) - [27] [CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) - [32] [CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) ]REFS] [33] [CITE[Git over HTTPS using OAuth token · GitHub Help]] ( ([TIME[2013-04-25 05:34:46 +09:00]] 版)) [34] [CITE@en[HTTP Authentication encoding test results]] ( ([[Bjoern Hoehrmann]] 著, [TIME[2014-02-15 00:18:19 +09:00]] 版))