[18] [[challenge]] の [DFN[[CODE(HTTP)@en[[[realm]]]]]] [[引数]]は、
[[HTTP認証]]が適用される範囲を表す短い文字列です。
[[認証方式]]によっては [[credentials]] でも使います。

* 仕様書

[REFS[
- [36] '''[CITE@en[RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication]] ([TIME[2014-09-11 10:01:28 +09:00]] 版) <https://tools.ietf.org/html/rfc7235#section-2.2>'''
- [45] [CITE@en[RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication]] ([TIME[2014-09-11 10:01:28 +09:00]] 版) <https://tools.ietf.org/html/rfc7235#section-5.1.2>
- [32] [CITE@en[RFC 5849 - The OAuth 1.0 Protocol]] ([TIME[2012-03-04 10:51:49 +09:00]] 版) <http://tools.ietf.org/html/rfc5849#section-3.5.1>
- [47] [CITE@en[RFC 6750 - The OAuth 2.0 Authorization Framework: Bearer Token Usage]] ([TIME[2015-02-11 06:22:47 +09:00]] 版) <http://tools.ietf.org/html/rfc6750#section-3>
- [49] [CITE@en[RFC 7617 - The 'Basic' HTTP Authentication Scheme]] ([TIME[2015-10-01 09:47:40 +09:00]] 版) <https://tools.ietf.org/html/rfc7617#section-2>
- [53] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-3.3>
- [35] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-5.2>
]REFS]

* 意味

[37] [DFN[[RUBYB[保護空間]@en[protection space]]]]は、
アクセスされている[[鯖]]の[[正準根URL]]と、指定されていれば
[CODE(HTTP)@en[[[realm]]]] の値とにより決まります [SRC[>>36]]。

;; [46] [[正準根URL]]の定義には [[URL scheme]]、[[ホスト名]]、[[ポート]]が含まれています。

;; [26] 他に [CODE(HTTP)@en[[[domain]]]] [[属性]]も使われることがあります。

[16] [CODE(HTTP)@en[[[realm]]]] は、[[鯖]]をいくつかの[[保護空間]]に分割するものです
[SRC[>>36, >>11, >>21, >>28]]。

;; [40] [[認証方式]]により特に定められている場合を除き、[[鯖]]の範囲を超えて[[保護空間]]を拡大することはできません
[SRC[>>36]]。 (逆に言えば[[認証方式]]によっては[[鯖]]の範囲を超えることができるようです。)

[29] [CODE(HTTP)@en[[[realm]]]] [[引数]]は、保護の[RUBYB[範囲]@en[scope]]を示す必要がある[[認証方式]]で使うために[[予約]]されています
[SRC[>>36, >>45]]。新しい[[認証方式]]はこれと非互換な方法で使っては[['''なりません''']]
[SRC[>>45]]。

[17] [CODE(HTTP)@en[[[realm]]]] は、通常[[起源鯖]]によって割り当てられる[[文字列]]であり、
[CODE(ABNF)@en[[[auth-scheme]]]] によっては更に何らかの意味を与えているかもしれません。 
[SRC[>>36, >>11, >>21, >>28]]

[12] [[要求]]が[[認証]]された場合であって、 [[realm]] が指定されていた場合にあっては、
同じ [[credentials]] が同一の [[realm]] を共有するすべての[[要求]]に対しても妥当であるべきです。
[SRC[>>11, >>22, >>24]]

;; [[credentials]] も参照。

[19] しばしば、「パスワードを入力してください」のような[[利用者]]に対するメッセージを含める場所として使われます。
入力するべき[[パスワード]]の種別を示した短い説明文や、
(機械的なアクセスを拒みたいなどの理由で[[パスワード]]を設定する場合に)
[[パスワード]]そのものが記述されていることもあります。

;; [38] [[応答]]が [[challenge]] を複数持つ場合、それぞれ別の [CODE(HTTP)@en[[[realm]]]]
でも構いません [SRC[>>36]]。

* 構文

[41] [CODE(ABNF)@en[[[auth-param]]]] の値は一般には[[字句]]か[[引用文字列]]とされていますが、
歴史的理由により、[[送信者]]は[[引用文字列]]として[[生成]]しなければ[['''なりません''']]
[SRC[>>36, >>53]]。しかし[[受信者]]は[[字句]]も対応しないといけないかもしれません [SRC[>>36]]。

[42] 値としては ([[引用文字列]]として表現できる) 任意の[[文字]]の列が認められているようです。

[3] >>1 によると[[空文字列]]も特に制限されていないみたいですね。

[15] [CODE(HTTP)@en[[[realm]]]] [[引数]]の値は[[大文字・小文字を区別します]] [SRC[>>11, >>21, >>28]]。

[20] [[RFC]] 上は認められていませんが、[[シフトJIS]]や[[UTF-8]]など任意の[[charset]]
による[[非ASCII文字]]が含まれることがよくあります。その場合、 
[CODE(HTTP)@en[[[Content-Type:]]]] [[ヘッダー]]の [CODE(MIME)@en[[[charset]]]]
[[引数]]があったとしても、それと一致しているとは限りません。

;; [52] [[RFC]] は問題の存在は認めながらも解決を先送りしています [SRC[>>51]]。

;; [CODE(ABNF)@en[[[auth-param]]]] も参照。

* 文脈

[13] [CODE(HTTP)@en[[[realm]]]] [[引数]]は [[challenge]] で指定します。

;; [30] [[RFC 1945]] と [[RFC 2068]] では他の [CODE(HTTP)@en[[[realm-param]]]]
よりも前に1つだけ指定する構文になっていましたが、[[RFC 2617]] では特にそういう制限はなくなっています。
(元から制限する意図が無かったのでしょう。)

;; [14] 以前は [CODE(HTTP)@en[[[realm]]]] [[引数]]は必須でした [SRC[>>11, >>21, >>28]]。
現在は [CODE(ABNF)@en[[[auth-scheme]]]] 依存でどちらとも規定できるようです。

* 基本認証の場合

[50] [CODE(HTTP)@en[[[Basic]]]] [[認証]]では、必須です [SRC[>>49]]。

* ダイジェスト認証の場合

[56] [CODE(HTTP)@en[[[Digest]]]] [[認証]]では、 [[challenge]] の他 [[credentials]]
でも使います [SRC[>>53]]。

[54] [[ダイジェスト認証]]では、 [CODE(HTTP)@en[[[realm]]]] は、
[[利用者]]が指定するべき[[利用者名]]と[[合言葉]]を知るために表示される[[文字列]]です
[SRC[>>53]]。少なくても[[認証]]を行う[[ホスト]]の名前は含んでいるべきで、
それに加えて[[利用者]]がアクセスできるであろう[[集成]]をも示すことができます [SRC[>>53]]。
[[challenge]] でも [[credentials]] でも使います [SRC[>>53]]。

[EG[
[55] 例えば [CODE[registered_users@example.com]] のような値を指定できます [SRC[>>53, >>26]]。
]EG]

[27] [CODE(HTTP)@en[[[realm]]]] [[引数]]の値は[[ダイジェスト値]]の計算に使われます。
[[非ASCII文字]]が含まれる場合の扱いは定かではありません。

[57] [[ダイジェスト値]]の計算に [CODE[[[realm]]]] が含まれているので、
[[サーバー]]内で生の[[合言葉]]を保存せずに[[ダイジェスト値]]だけを保管している場合で、
それが仮に流出したとしても、生の[[合言葉]]は簡単にはわからない (と期待される)
ので、他の [CODE[[[realm]]]] にその値を流用するのが難しくなります [SRC[>>35]]。

;; [58] しかし、[[サーバー]]は生の[[合言葉]]を何らかの方法で保存しないと
[CODE[[[realm]]]] を新設できませんし、[[ダイジェストアルゴリズム]]をより安全なものに変更することもできません。。。

[59] [CODE[[[realm]]]] は、特定の[[利用者]]が使い得る他のどんな
[CODE[[[realm]]]] とも異なるものとする[['''べきです''']]。
そのために[[認証]]を行う[[ホスト]]の名前を含める[['''べきです''']]。 [SRC[>>35]]

* OAuth の場合

[33] [[OAuth 1.0]] は [CODE(HTTP)@en[[[realm]]]] [[引数]]を追加して[['''構わない''']]としています
[SRC[>>30]]。逆に言えば省略しても構わないということで、 >>14 と矛盾していました。

[10] [[OAuth 1.0]] だと [CODE(HTTP)@en[[[realm]]]] は意味が無いのですが、指定することは認められています。
特に意味が無いので[[空文字列]]が指定されたりすることもあります。

[34] [[OAuth 1.0]] では [CODE(HTTP)@en[[[realm]]]] を省略することができますが、
[[Apple]] のライブラリー [CODE[[[NSURLProtectionSpace]]]] を使っている [[Safari]] や [[iOS]]
アプリケーションは [CODE(HTTP)@en[[[realm]]]] が存在しないとクラッシュします。 [TIME[2012-12-19T05:49:25.300Z]]

[48] [[OAuth 2.0]] [CODE(HTTP)@en[[[Bearer]]]] は [[RFC 2617]] を参照して
[CODE(HTTP)@en[[[realm]]]] の使用を認めています [SRC[>>47]]。
実際には意味はなさそうです。

* VAPID の場合

[65] [[VAPID]] では無視されます。

* 処理

[39] [[保護空間]]によって [[credentials]] が自動的に適用できる範囲が決まります。
[[利用者エージェント]]は、以前の[[要求]]が[[認可]]されている場合には、
その [[credentials]] を[[保護空間]]内の他の[[要求]]にも ([CODE(ABNF)@en[[[auth-scheme]]]] や
[CODE(ABNF)@en[[[auth-param]]]] や[[利用者]]の設定で決まる期間中は)
再利用して構いません。 [SRC[>>36]]

* レンダリング

[43] [[基本認証]]や[[ダイジェスト認証]]では、[[利用者]]の名前と[[合言葉]]の入力を促す画面に
[CODE(HTTP)@en[[[realm]]]] の値も示す実装が普通です。[[鯖]]側でも、
[[利用者]]に表示されることを前提とした[[人間可読]]なメッセージを
(当該[[資源]]において相応しいと思われる[[言語]]で) 記述するのが一般的です。

;; [44] [CODE(HTTP)@en[[[realm]]]] を表示することは [[HTTP]] 仕様上は特に要求されていないようですが、
表示しない[[Webブラウザー]]は [[Web互換]]とは言えなそうです。

[63] 
最近の [[Chrome]] は表示しないみたいですね。
[TIME[2018-10-23T07:24:30.900Z]]

[64] 
[[ロボット]]アクセス拒否を目的に?[[基本認証]]を使っていて、
[CODE[realm]] に [[credentials]] が書いてあるサイトもあるのですが、
[[Chrome]] ではそのことがわかりません。

* 歴史

** RFC 第1世代

[REFS[
- [11] [CITE@en[RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0]] ([TIME[2012-02-18 23:25:56 +09:00]] 版) <http://tools.ietf.org/html/rfc1945#section-10.2>
]REFS]

** RFC 第2世代

[REFS[
- [21] [CITE@en[RFC 2068 - Hypertext Transfer Protocol -- HTTP/1.1]] ([TIME[2012-02-18 23:30:14 +09:00]] 版) <http://tools.ietf.org/html/rfc2068#section-11>
- [22] [CITE@en[RFC 2068 - Hypertext Transfer Protocol -- HTTP/1.1]] ([TIME[2012-02-18 23:30:14 +09:00]] 版) <http://tools.ietf.org/html/rfc2068#section-14.8>
]REFS]

** RFC 第3世代

[REFS[
- [24] [CITE@en[RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1]] ([TIME[2012-01-09 20:55:20 +09:00]] 版) <http://tools.ietf.org/html/rfc2616#section-14.8>
- [28] '''[CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) <http://tools.ietf.org/html/rfc2617#section-1.2>'''
]REFS]

[FIG(quote)[
[FIGCAPTION[
[1] RFC 2617 での定義
]FIGCAPTION]

>
[PRE(ABNF code)[
      realm       = "realm" "=" realm-value
      realm-value = quoted-string
]PRE]
>   The realm directive (case-insensitive) is required for all
authentication schemes that issue a challenge. The realm value
(case-sensitive), in combination with the canonical root URL (the
absoluteURI for the server whose abs_path is empty; see section 5.1.2
of [2]) of the server being accessed, defines the protection space.
These realms allow the protected resources on a server to be
partitioned into a set of protection spaces, each with its own
authentication scheme and/or authorization database. The realm value
is a string, generally assigned by the origin server, which may have
additional semantics specific to the authentication scheme. Note that
there may be multiple challenges with the same auth-scheme but
different realms.
]FIG]

** Digest 認証での用法

[REFS[
- [25] [CITE@en[RFC 2069 - An Extension to HTTP : Digest Access Authentication]] ([TIME[2012-02-26 10:05:21 +09:00]] 版) <http://tools.ietf.org/html/rfc2069#section-2.1.1>
- [31] [CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) <http://tools.ietf.org/html/rfc2617#section-3.2.1>
]REFS]

** RFC 第4世代

[REFS[
- [23] '''[CITE@en[RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication]] ([TIME[2014-09-11 10:01:28 +09:00]] 版) <https://tools.ietf.org/html/rfc7235#section-2.2>'''
- [51] [CITE@en[RFC 7617 - The 'Basic' HTTP Authentication Scheme]] ([TIME[2015-10-01 09:47:40 +09:00]] 版) <https://tools.ietf.org/html/rfc7617#section-3>
]REFS]

* 統計

[4] [CITE@en[HTTP/1.1 WWW-Authenticate header]] ([TIME[2009-07-19 11:05:40 +09:00]] 版) <http://www.http-stats.com/WWW-Authenticate>

* 例

[5]  >>4 より
>
[PRE(HTTP example code)[
WWW-Authenticate: Basic realm=""
]PRE]

[6]  >>4 より
>
[PRE(HTTP example code)[
WWW-Authenticate: Basic
]PRE]

[7] >>4 より
>
[PRE(HTTP example code)[
WWW-Authenticate: Basic realm = "You need ID",
]PRE]

[8] >>4 より
[PRE(HTTP example code)[
WWW-Authenticate: Basic realm= /
]PRE]

[9] >>4 より
[PRE(HTTP example code)[
WWW-Authenticate: Basic realm=BSI SkimmerPlus Server 1.0.0.20 / 1.0.0.30
]PRE]

* メモ

[60] [CITE@en[RFC 7804 - Salted Challenge Response HTTP Authentication Mechanism]]
([TIME[2016-04-01 08:53:49 +09:00]] 版)
<https://tools.ietf.org/html/rfc7804#section-5>

[61] [CITE@en[RFC 8053 - HTTP Authentication Extensions for Interactive Clients]] ([TIME[2017-01-26 12:13:39 +09:00]]) <https://tools.ietf.org/html/rfc8053#section-4.1>

[62] [CITE@en[RFC 8120 - Mutual Authentication Protocol for HTTP]]
([TIME[2017-04-20 12:04:06 +09:00]])
<https://tools.ietf.org/html/rfc8120#section-3.1>