*/ public const FORWARDED_HEADERS = [ 'X-Forwarded-For', 'X-Forwarded-Proto', 'X-Forwarded-Host', 'X-Forwarded-Port', 'X-Forwarded-Prefix', 'X-Forwarded-Aws-Elb', 'Forwarded', ]; /** * 요청 1건에 대한 신뢰 프록시 진단 결과를 반환합니다. * * @param Request|null $request 진단 대상 요청 (콘솔 등 요청이 없는 맥락이면 null) * @return array{forwarded_headers: array, trusted_configured: bool, configured_proxies: string|null, is_secure: bool|null, client_ip: string|null, remote_addr: string|null, status: string} 진단 결과 */ public static function forRequest(?Request $request): array { $configured = self::configuredProxies(); $trustedConfigured = self::isConfigured(); if ($request === null) { return [ 'forwarded_headers' => [], 'trusted_configured' => $trustedConfigured, 'configured_proxies' => $configured, 'is_secure' => null, 'client_ip' => null, 'remote_addr' => null, 'status' => self::STATUS_NOT_APPLICABLE, ]; } $forwarded = self::forwardedHeaders($request); return [ 'forwarded_headers' => $forwarded, 'trusted_configured' => $trustedConfigured, 'configured_proxies' => $configured, 'is_secure' => $request->isSecure(), 'client_ip' => $request->ip(), 'remote_addr' => $request->server('REMOTE_ADDR'), 'status' => ($forwarded !== [] && ! $trustedConfigured) ? self::STATUS_WARNING : self::STATUS_OK, ]; } /** * 요청이 수신 중인 전달 헤더의 이름 목록을 반환합니다. * * @param Request $request 대상 요청 * @return array 수신 중인 헤더 이름 목록 */ public static function forwardedHeaders(Request $request): array { $present = []; foreach (self::FORWARDED_HEADERS as $header) { if ($request->headers->has($header)) { $present[] = $header; } } return $present; } /** * 신뢰 프록시가 설정되어 있는지 반환합니다. * * 빈 문자열은 미설정과 같게 다룬다 — `.env` 에 `TRUSTED_PROXIES=` 만 남겨 둔 상태가 * "설정됨" 으로 판정되면 경고가 조용히 사라지는데, 미들웨어는 여전히 아무것도 신뢰하지 않는다. * * @return bool 설정 여부 */ public static function isConfigured(): bool { return self::configuredProxies() !== null; } /** * 설정된 신뢰 프록시 값을 반환합니다 (미설정이면 null). * * @return string|null 설정값 */ public static function configuredProxies(): ?string { $proxies = config('trustedproxy.proxies'); if (is_array($proxies)) { $proxies = implode(',', $proxies); } if (! is_string($proxies)) { return null; } $proxies = trim($proxies); return $proxies === '' ? null : $proxies; } }