$settings 설정 배열 (복호화된 상태) * @param array $schema 설정 스키마 (sensitive 플래그 보유) * @return array 마스킹된 설정 배열 */ public static function apply(array $settings, array $schema): array { foreach ($schema as $field => $config) { if (! is_array($config) || ! ($config['sensitive'] ?? false)) { continue; } if (! array_key_exists($field, $settings)) { continue; } if ($settings[$field] === null || $settings[$field] === '') { continue; } $settings[$field] = self::MASK; } return $settings; } /** * 저장 요청에서 마스크로 되돌아온 sensitive 필드를 제거한다. * * 제거된 필드는 저장 단계의 기존 설정 병합에서 종전 값이 유지된다. * * @param array $settings 저장 요청 설정 배열 * @param array $schema 설정 스키마 * @return array 마스크 필드가 제거된 설정 배열 */ public static function stripUnchanged(array $settings, array $schema): array { foreach ($schema as $field => $config) { if (! is_array($config) || ! ($config['sensitive'] ?? false)) { continue; } if (($settings[$field] ?? null) === self::MASK) { unset($settings[$field]); } } return $settings; } }