[1] [DFN[[CODE(HTTP)@en[[[Server:]]]]]] [[ヘッダー]]は、
[[要求]]を処理して[[応答]]を[[生成]]した[[起源鯖]]の[[ソフトウェア]]の名前や版を表します。

[24] [[要求メッセージ]]で[[利用者エージェント]]を表す
[CODE(HTTP)@en[[[User-Agent:]]]] [[ヘッダー]]に相当するもので、構文も同じです。

* 仕様書

[REFS[
- [9] '''[CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-7.4.2>'''
- [25] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-9.6>
- [28] [CITE[UPnP Device Architecture 2.0]] ([TIME[2014-09-05 02:24:48 +09:00]] 版) <http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v2.0.pdf#page=31>
]REFS]

* 意味

[10] [CODE(HTTP)@en[[[Server:]]]] [[ヘッダー]]は、
[[起源鯖]]が[[要求]]を処理するために使った[[ソフトウェア]]の情報を含みます [SRC[>>9]]。

[11] この[[ヘッダー]]は、[[クライアント]]が[[相互運用性]]の問題の範囲を特定するのを補助したり、
特定の[[鯖]]の制限に対処するために使ったりすることがあります [SRC[>>9]]。

[18] モジュール化された[[鯖]]では、[[起源鯖]]本体だけでなく、
モジュールの情報も値に含まれることがあります。

[EG[
[19] 例えば [[Apache]] は
[PRE(HTTP code)[
Server: Apache/2.2.6 (Unix) mod_ssl/2.2.6  PHP/5.3.6
]PRE]
... のような [CODE(HTTP)@en[[[Server:]]]] [[ヘッダー]]を[[生成]]することがあります。
]EG]

[17] [[起源鯖]]は、必要以上の詳細を含む [CODE(HTTP)@en[[[Server:]]]]
[[ヘッダー]]を[[生成]]する[['''べきではなく''']]、
第三者の部分製品が値を追加することを制限する[['''べきです''']]。
長すぎると[[応答]]の[[遅延]]を増大させてしまいますし、
攻撃者が既知の[[セキュリティーホール]]を探すのを容易にしてしまいます。 [SRC[>>9]]

;; [26] ただし実際にはソフトウェアの版情報がなくとも攻撃者は[[セキュリティーホール]]を探していることも指摘されています
[SRC[>>25]]。

[EG[
[20] 例えば、
[PRE(HTTP code)[
Server: Apache/2.4.10 (Unix) OpenSSL/1.0.1i
]PRE]
... のような [CODE(HTTP)@en[[[Server:]]]] [[ヘッダー]]が実際に使われていますが、
[[OpenSSL]] を [[HTTP]] [[起源鯖]]のソフトウェア名の一部として記述するのが妥当なのかは怪しいところです。
]EG]

* 構文

[14] 1つ以上の [CODE(ABNF)@en[[[product]]]] または [CODE(ABNF)@en[[[comment]]]]
を、 [[RWS]] 区切りで並べたものとされています。ただし、最初の1つは
[CODE(ABNF)@en[[[product]]]] でなければなりません。 [SRC[>>9]]

[FIG(railroad)[
= [CODE(ABNF)@en[[[product]]]]
= *
== [[RWS]]
== |
=== [CODE(ABNF)@en[[[product]]]]
=== [CODE(ABNF)@en[[[comment]]]]
]FIG]

[15] ここで [CODE(ABNF)@en[[[product]]]] は、[[起源鯖]]のソフトウェアと主要な部分製品を識別上の重要なものから順番に並べたもの
[SRC[>>9]] とされています。

;; [16] この構文は [CODE(HTTP)@en[[[User-Agent:]]]] [[ヘッダー]]と同じです。
[CODE(HTTP)@en[[[User-Agent:]]]] と同じく、必ずしもこの構文は守られていません。
ただ[[利用者エージェント]]の多様性に比べ[[起源鯖]]の種類は多くないので、
この構文に適合する [CODE(HTTP)@en[[[Server:]]]] [[ヘッダー]]はかなり多い印象です。

[27] [[セキュリティー]]のために、詳細な情報を記述することは好ましくないと考える人もいます。
実際にどの程度詳細な情報が指定されるかは、[[鯖]]の実装や設定によって様々です。
[[鯖]]ソフトウェアによっては、[[著者]]の設定によって詳細度を数段階制御できたり、
追加モジュール等の [[API]] によって追加モジュール等の製作者が自由に情報を追加できたりすることもあります。

[29] [[SSDP]] では更に詳しく構文が決められていて、 [[UPnP]] の版などを入れることになっています [SRC[>>28]]。

* 文脈

[12] [[起源鯖]]は [CODE(HTTP)@en[[[Server:]]]] [[ヘッダー]]を[[生成]]して構いません
[SRC[>>9]]。

;; [13] 多くの[[鯖]]が[[生成]]するようですが、[[必須]]ではないようです。

[30] [[プロキシサーバー]]が[[転送]]時に[[応答]]に [CODE[Server:]]
[[ヘッダー]]が存在していない場合に[[生成]]して良いかどうか、
明記されていません。一般的には明記されていないことは認められないと解釈するべきと思われます。

;; [31] [[プロキシサーバー]]に関する情報は [CODE[Via:]] [[ヘッダー]]に記述できます。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[3] RFC 1945 (HTTP/1.0) 10.14; RFC 2068 (HTTP/1.1) 14.39; RFC 2616 (HTTP/1.1) 14.38 Server
]FIGCAPTION]

> The Server response-header field contains information about the
software used by the origin server to handle the request. The field
can contain multiple product tokens (Section [DEL[[INS[{1945}]] 3.7]] [INS[3.8]]) and comments
identifying the server and any significant subproducts. [DEL[[INS[{1945}]] By convention, the]] [INS[The]]
product tokens are listed in order of their significance for identifying the application.

[CODE(HTTP)[Server]] [[応答頭欄]]は、[[起源鯖]]で[[要求]]を取り扱うために使われているソフトウェアについての情報を含めます。
この欄は、複数の [CODE(ABNF)[[[product]]]] 字句およびサーバーと重要な部分製品を識別する[[注釈]]を含めることができます。
[CODE(ABNF)[product]] 字句は、その応用を識別するのに有意な順に列挙します。

>
- Server         = "Server" ":" 1*( product | comment )

> Example:
- Server: CERN/3.0 libwww/2.17

> If the response is being forwarded through a proxy, the proxy
application [DEL[[DEL[{1945}]] must not add its data to the product list]] [INS[[INS[{2068,2616}]] MUST NOT modify the Server response-header]]. [INS[Instead, it [DEL[[INS[{2068,2616}]] SHOULD]] [INS[[INS[{Errata}]] MUST]] include a Via field (as described in section [DEL[[INS[{2068}]] 14.44]] [INS[[INS[{2616}]] 14.45]]).]]

応答が[[串]]を通じて転送される時には、串応用は [CODE(HTTP)[Server]]
応答頭を修正しては'''なりません'''。
代わりに、 [CODE(HTTP)[[[Via]]]] 欄を含めなければ'''なりません'''。

> Note: Revealing the specific software version of the server [DEL[may]] [INS[[INS[{2616}]] might]]
allow the server machine to become more vulnerable to attacks
against software that is known to contain security holes. Server
implementers are encouraged to make this field a configurable option.

注意: 鯖の特定ソフトウェアの版を晒すと、既知の安全上の穴があるソフトウェアへの攻撃に関してより脆弱になってしまうかもしれません。
鯖実装者はこの欄を設定可能な選択肢とすることを推奨します。

[DEL[

> [INS[{1945}]] Note: Some existing servers fail to restrict themselves to the
product token syntax within the Server field.

注意: 既存の鯖の中には [CODE(HTTP)[Server]] 欄の [CODE(ABNF)[product]] 
字句構文に反しているものもあります。
]DEL]
]FIG]

[2] [CITE@en[RFC 3507 - Internet Content Adaptation Protocol (ICAP)]]
( ([TIME[2014-06-08 07:17:07 +09:00]] 版))
<http://tools.ietf.org/html/rfc3507#section-4.3.3>

* 関連

[7]
[[CGI]] ではほぼ相当する[[メタ変数]] [CODE(CGI)[[[SERVER_SOFTWARE]]]] があります。

[21] [[要求メッセージ]]には[[利用者エージェント]]を表す [CODE(HTTP)@en[[[User-Agent:]]]]
[[ヘッダー]]があります。

[22] [[串]]は [CODE(HTTP)@en[[[Via:]]]] [[ヘッダー]]にソフトウェア名を記述できます。

[23] [[鯖]]の裏側で実際に処理を行う[[アプリケーションサーバー]]の類の情報は、
[CODE(HTTP)@en[[[Server:]]]] には記述せず、 [CODE(HTTP)@en[[[X-Powered-By:]]]]
や [CODE(HTTP)@en[[[X-Framework:]]]] のような[[ヘッダー]]に記述するのが一般的です。
[[鯖]]のモジュールとして動作する [[PHP]] や [[mod_perl]] などは
[CODE(HTTP)@en[[[Server:]]]] に現れる場合と [CODE(HTTP)@en[[[X-Powered-By:]]]]
などに現れる場合、両方に現れる場合があります。いずれにせよ[[アプリケーションサーバー]]上で実際に動く
([[言語]]や[[フレームワーク]]の類ではない) 実際の[[アプリケーション]]の名前が記載されることはあまりないようです。

* 例

- [4] [CODE(HTTP)[Server: WebLogic 5.1.0 Service Pack 11 11/20/2001 08:39:10 #149952]] (不正!)
- [5] [CODE(HTTP)[Server: Apache/1.3.27 (Unix)  (Vine/Linux) mod_gzip/1.3.19.1a mod_ssl/2.8.12 OpenSSL/0.9.6k PHP/4.2.3]]  ※SSL は組み込んでいるけど有効にしていません。
- [6] [CODE(HTTP)[Server: Jigsaw/2.2.2]] 

* メモ

[8]
[CITE[Kazuho@Cybozu Labs: サーバシグニチャは隠さないのが当たり前]] ([TIME[2007-09-08 09:04:25 +09:00]] 版) <http://labs.cybozu.co.jp/blog/kazuho/archives/2007/09/re_server_sig.php>

[FIG(quote)[
[FIGCAPTION[
[32] [CITE@en[GitHub]]
([TIME[2018-04-14 20:01:47 +09:00]])
<https://github.com/>
]FIGCAPTION]

> Server: GitHub.com

]FIG]

[33] <https://www.facebook.com/> は [CODE[Server:]] を送信しないようです。
[TIME[2018-04-14T11:08:19.200Z]]

[FIG(quote)[
[FIGCAPTION[
[34] [CITE@en[Configuration • Akka HTTP]]
([TIME[2018-03-27 23:00:57 +09:00]])
<https://doc.akka.io/docs/akka-http/current/configuration.html>
]FIGCAPTION]

>     # The default value of the `Server` header to produce if no
>     # explicit `Server`-header was included in a response.
>     # If this value is the empty string and no header was included in
>     # the request, no `Server` header will be rendered at all.
>     server-header = akka-http/${akka.http.version}
> 

]FIG]


[FIG(quote)[
[FIGCAPTION[
[35] [CITE@ja[国土交通省]]
([TIME[2018-04-24 18:53:20 +09:00]])
<http://www.mlit.go.jp/>
]FIGCAPTION]

> Server: Secret

]FIG]

[[Webサーバー]]は[[国家機密]]のようですw