방어적 프로그래밍은 Symfony HttpClient와 함께 매우 쉽게 할 수 있습니다

발행: (2026년 3월 1일 오전 03:37 GMT+9)
2 분 소요
원문: Dev.to

Source: Dev.to

Problem

앱에서 사용자가 URL을 제출하고 이를 가져와서(링크 미리보기, 웹훅, RSS 피드 등) 처리한다면, 심각한 보안 문제가 발생할 수 있습니다. 공격자는 http://127.0.0.1/admin 혹은 http://169.254.169.254(AWS 메타데이터 엔드포인트)와 같은 URL을 제출할 수 있으며, 서버는 이를 그대로 요청하게 됩니다. 이는 Server‑Side Request Forgery (SSRF) 공격입니다.

Solution

Symfony는 내장 솔루션을 제공합니다: NoPrivateNetworkHttpClient. 기존 HTTP 클라이언트를 데코레이터 형태로 감싸며, 사설 IP 대역(또는 설정한 모든 대역)에 대한 요청을 차단합니다.

Before

getPayload()
            ->getString('url');

        $response = $this->client
            ->request('GET', $url);

        return new JsonResponse(
            $response->getContent()
        );
    }
}

After

safeClient = new NoPrivateNetworkHttpClient($client);
    }

    #[Route('/api/preview', methods: ['POST'])]
    public function preview(
        Request $request,
    ): JsonResponse {
        $url = $request->getPayload()
            ->getString('url');

        $response = $this->safeClient
            ->request('GET', $url);

        return new JsonResponse(
            $response->getContent()
        );
    }
}

NoPrivateNetworkHttpClient는 데코레이터이므로 기존 클라이언트를 간단히 감싸기만 하면 됩니다—다른 코드 변경은 필요하지 않습니다. 차단하고 싶은 특정 IP 또는 IP 대역을 설정하려면 Symfony 문서를 참고하세요.

사용자가 제출한 URL을 가져오면서 이 데코레이터를 사용하지 않았다면, 지금 바로 적용하시기 바랍니다.

YouTube에서 설명을 시청하세요.

0 조회
Back to Blog

관련 글

더 보기 »

국가 코드와 지역 차이

Symfony Intl로 코소보 지원 Symfony의 Intl 컴포넌트는 코소보를 포함하지 않는데, 그 이유는 ISO 3166‑1 코드 XK가 공식 코드가 아니라 사용자 할당 코드이기 때문입니다.