kumpei.ikuta.me

HTTP で存在の有無を隠したいときはどのステータスコードを使えばよいか?

結論:404 Not Found でいい

情報公開制度とグローマー拒否

日本(をはじめとした多くの国)には情報公開制度という仕組みがあり、国民や自治体の住民が行政文書を閲覧できるシステムが整っている。もちろんあらゆる文書を自由に見ていいというわけではなく、たとえば日本では、

  • 個人情報
  • 公にすることで、国家や公共の安全を脅かしかねない情報
  • 公にすることで、公正な競争に支障を生じさせる可能性のある情報

などの開示は拒否されるか、一部を黒塗りにした状態で開示される(部分開示)。

また、文書の内容のみならず「請求された文書が存在するか否か?」という情報ですら公にすることができない場合、国や自治体は、その文書があるかどうかを答えることなく開示を拒否することができる。これは グローマー拒否 とよばれ、日本の情報公開法では第 8 条で

第八条
開示請求に対し、当該開示請求に係る行政文書が存在しているか否かを答えるだけで、不開示情報を開示することとなるときは、行政機関の長は、当該行政文書の存否を明らかにしないで、当該開示請求を拒否することができる。

と定められている。存在の有無すら公開できない情報なんてあるの?と思うが、 東京都が公開している「存否応答拒否一覧表」 を見てみると、結構な量のグローマー拒否が行われていることがわかる。たとえば、平成 29 年 12 月 26 日に警視庁に請求された

警視庁において、平成29年度、警視総監が精神科、心療内科等を受診した記録

の情報は「存在するけど個人情報だから開示拒否」や「存在しないので開示拒否」をしてしまうと、警視総監に精神科または診療内科の受診歴があるかどうかが公になってしまうため、グローマー拒否されている(ただし、グローマー拒否が必要以上に濫用されているという指摘もある)。

HTTP におけるグローマー拒否

さて、情報公開制度の「文書の開示を請求」→「請求内容に応じて開示または拒否」という流れは、HTTP の GET リクエストによく似ている。そこで、情報公開制度を HTTP ベースで取り行うということを考えてみる。

通常どおり開示された場合は 200 OK が、「存在するけど開示拒否」は 403 Forbidden や 451 Unavailable For Legal Reasons が該当する。また、「存在しないので開示拒否」の場合は 404 Not Found が該当する。では、グローマー拒否を行う場合はどのようなレスポンスを返すべきか?

実は、HTTP はグローマー拒否についてもきちんと取り扱うことができる。答えは、RFC に書いてある。

RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content

The 404 (Not Found) status code indicates that the origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

6.5.4. 404 Not Found より抜粋)

ということなので、正解は 404 Not Found だった。存在の有無を公開しないのに Not Found と言うのは少し違和感があるが、規格でそう決まっているのでしかたがない。

Web API 等を利用する際など、外部の HTTP サーバとの通信を行うアプリケーションを開発するときは、サーバから 404 Not Found が返ってきた場合、「要求したリソースが見付からなかった」か、あるいは「要求したリソースの存在の可否が秘匿されている」という 2 通りの状態があり得る(そして、これらを区別する方法はない)ことに留意するべきである。

back to index