公開レスポンスから外す属性は DTO ごと消す — 分岐で隠すと不在テストが素通りする
セキュリティ
設計判断
API設計
判断
運用
原則
未認証で誰でも読める公開応答に載せないと決めた属性(個人名など)の扱い方。
判断
条件分岐やマスキングで隠すのではなく、取得クエリからも DTO からもフィールドごと消す。露出しないことを「実装が正しく隠し続けること」ではなく「そもそも値がその経路に存在しないこと」で担保する。表示側の実装ミスや、別クライアントの追加で漏れる経路が構造的に無くなる。
公開ページの全件が検索インデックスに載る設計(一覧から個別ページを機械生成する類)では、露出面が最大になるため、この差が特に効く。
見落としやすい検証の穴
「レスポンスに当該キーが含まれないこと」を文字列の非包含で表明する回帰テストは、シリアライザの空値省略オプションと組み合わさると素通りする。テストのフェイクやスタブが当該フィールドにゼロ値しか返さない限り、キー自体が出力されないため、後から DTO にフィールドを足しても落ちない。
反証力を持たせるには次のどちらかにする。
- 応答オブジェクトのキー集合を許可リストと完全一致で突き合わせる(未知のキーが増えたら落ちる)
- 保存層にセンチネル値を置き、データ取得から応答生成までの実経路を通す境界テストにする
適用条件
「その属性を出すかどうか」を利用者ごとに切り替える必要がある場合は分岐が要るので、この判断は当てはまらない。全経路で一律に出さないと決められる属性にだけ使う。