はじめに
Laravel(8.5.0)でAPIリソースを使ってAPI呼び出し時のjsonの返却機能を別クラスに移行する、という作業をする際に先輩から
「キャッシュはいじらないでね。APIのキャッシュは基本禁止だから。キャッシュの設定ミスによる情報漏洩はよくある話だよ」
と念押しされた。
ただ、この「APIのキャッシュは基本禁止」と「情報漏洩」の関係性が理解できず色々と勉強した結果をメモ
どういうことか?
起きうる事象
ここでいう情報漏洩とは、具体的には
「Aさん向けのjsonレスポンスがキャッシュされてBさんに見えてしまう」
などのことが起きうる、ということ。
これはAPIというものが決まったURLにアクセスするとリソースのデータがjsonで取得できる可能性があるという特性が前提にある。
尚、この情報漏洩についてはIPAの図解が非常にわかりやすかった
現状
現状は、今のキャッシュの設定は
Cache-Controll : no-cache, private
であった。ちなみに、これはLaravelのデフォルト設定。
このキャッシュの設定の内、privateは以下の意味を持つ
Cache-Control: private
Webサーバから返されるコンテンツがただ一人のユーザのためのものであることを示す。このコンテンツは、複数のユーザが共有されるキャッシュに記録されるべきではないことを表している。
※IPAの記事より抜粋
要はprivateは
「AさんのjsonデータはBさんはアクセスしてはいけません」
という場合に設定するべきものということ。
結論
要するに今回の先輩の
「APIのキャッシュは基本禁止」
というアドバイスは詳細を補足すると
「(APIリソースを導入しようとした際に何かの拍子でprivateを消してしまうと重大な脆弱性を生んでしまうので、)APIのキャッシュは基本禁止(で実装してね)」
ということだった。
おわりに
この事実は知らなかったので、知れてよかったと思う
補足として、今回のような情報漏洩が具体的にどのキャッシュで起こるかというと、プロキシサーバ(IPAリンク先の図解の「中間サーバー」)で起こるとのこと。
これはなかなか言われないと気づかない…