[스프링 Web] RestTemplate이 쏘는 패킷을 보고싶다 - Fiddler4로 JVM 패킷 디버깅하기

웹 개발/스프링 프레임워크

2021. 12. 14.

Fiddler4 프록시

Fiddler4 화면

Fiddler4 프록시 소개

단말에서 송수신하는 HTTP(S) 패킷을 조회하는 데스크톱 응용입니다. 흔히 보는 브라우저 개발자 툴, 네트워크 분석 도구과 흡사합니다.

 

차이점은 해당 데스크탑을 포워드 프록시 서버로 만들어 준다는 점입니다.

  • FIddler4를 켜면 기본적으로 8888번 포트로 프록시 서버가 실행됩니다.
  • 내 스마트폰의 네트워크 설정에서 본인 데스크탑을 프록시로 지정하면, 폰을 오고가는 HTTP(S) 패킷을 디버깅 할 수 있습니다. 이것이 제가 FIddler4를 쓰는 주 사용처입니다.

 

한 편, 오고 가는 패킷을 인터셉트하여 커스터마이징 하는 기능도 제공하고 있습니다. 엄청 재밌는 기능이에요.

웹 페이지의 i18n을 테스트할 때 리퀘스트의 로케일을 ko-KR에서 ja-JP로 덮어 씌우는 등... 활용처가 있습니다.

 

이런 Fidder4의 다양한 기능과 UI에 의지하며 스프링 RestTemplate이 타사 API와 주고 받는 요청을 디버깅하고자 했습니다. JVM의 HTTP 요청이 프록시 서버를 거쳐 다니도록 하면 될 일입니다. 이렇게 하면 자바 웹 클라이언트(예를 들어, RestTemplate)가 송수신하는 패킷을 들여다 볼 수 있습니다.

JVM 發 요청이 프록시를 거쳐가도록 설정

(링크 글의 내용을 옮겨왔습니다. )

피들러는 프로그램을 켜면 자동으로 8888번 포트에 프록시 서버를 엽니다. 그럼 바로 HTTP 패킷을 엿볼 수 있게 되는데요.

 

하지만 HTTPS 패킷을 보려면 인증서가 필요하죠?

  • 상대 측 인증서를 신뢰하기 위한 CA 인증서 체인

JVM에서는 인증서 신뢰를 위한 키스토어를 생성하고, CA 인증서를 이곳에 보관합니다. 이를 위한 절차가 아래 소개됩니다.

인증서와 키스토어 생성하기

  1. Fiddler4> Tools> Options> HTTPS> Actions> Export Root Certificate to Desktop 클릭
  2. CMD 열기
  3. echo %JAVA_HOME%
  4. %JAVA_HOME%> bin 폴더 이동> keytool 명령어로 키 스토어 생성 (1단계에서 만든 인증서 번들 필요함)
  5. keytool.exe -import -file C:\Users\\\Desktop\\FiddlerRoot.cer -keystore FiddlerKeystore -alias Fiddler
  6. 키스토어 비밀번호 설정 후 인증서 신뢰 Y

JVM과 프록시 서버 간 연결 설정

방법1. 실행 옵션 넣어주기

JVM 실행 시에 실행 옵션을 주어 프록시 서버와의 연결을 설정을 할 수 있습니다. 일반적으로 IDE에서 실행 환경 설정이 가능합니다. 아래 옵션들을 입력해 주면 됩니다.

-DproxySet=true
-DproxyHost=127.0.0.1
-DproxyPort=8888
-Djavax.net.ssl.trustStore="path\to\java_home\bin\FiddlerKeyStore" 
-Djavax.net.ssl.trustStorePassword="password_used_during_keystore_creation"

방법2. System.property 호출로 넣어주기

자바 코드로 프록시 서버를 설정해 보겠습니다. 실행 옵션을 부여하는 것 대신, 코드에서 System.setProperty() 를 호출하여도 됩니다. 스프링 프레임워크를 사용한다면 프록시 설정 빈을 만들어 부트스트랩 하실 수 있겠습니다.

 

[ProxyEnabler.java] 파일

@Profile("proxy")
@Component
public class ProxyEnabler {

    @PostConstruct
    void enableProxy() {
        Properties props = new Properties();
        try {
            props.load(new ClassPathResource("proxy-config.properties").getInputStream());
            System.setProperties(props);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

스프링 컨텍스트가 ProxyEnabler 빈을 생성하게 되면, 프로퍼티 파일을 읽어와서 시스템 프로퍼티로 옮겨주게 됩니다.

그럼 JVM을 오가는 패킷을 Fiddler4가 볼 수 있습니다!

 

[proxy-config.properties] 파일

이 때 프로퍼티 파일의 내용은 위에서 본 JVM 실행 옵션과 동일한 것들입니다.

http.proxyHost=127.0.0.1
https.proxyHost=127.0.0.1
http.proxyPort=8888
https.proxyPort=8888
javax.net.ssl.trustStore=C:\\Users\\wnwoq\\.jdks\\azul-1.8.0_275\\bin\\FiddlerKeystore
javax.net.ssl.trustStorePassword=password

설정 끝

이제 JVM 측이 생성하고 수신하는 HTTP 패킷은 Fiddler4를 거쳐갑니다.

한 번 RestTemplate로 웹 API 요청을 날려 보았습니다.

해당 요청들이 피들러 프록시에 캡쳐되는 것을 확인할 수 있습니다.

image