
프록시 서버를 통한 HTTPS 연결 방식: CONNECT 메서드
HTTP 프록시를 사용하여 네트워크에 연결할 때, 프록시 서버는 클라이언트의 요청을 전달합니다. 그러나 HTTPS는 먼저 TLS 핸드셰이크가 필요하기 때문에, 프록시 서버는 요청을 직접 전달할 수 없으며 먼저 연결을 설정해야 합니다.
HTTP 프록시 요청 전달
프록시 서버는 HTTP 연결(TLS 암호화가 없는 연결)을 매우 간단하게 처리합니다. 예를 들어, 클라이언트가 example.com에 접근하려고 할 때, 다음과 같은 요청을 보냅니다:
GET http://example.com/index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Proxy-Connection: keep-alive
이 요청은 먼저 프록시 서버를 통과합니다. 프록시는 대상 URL을 파싱한 후 요청을 완전히 전달합니다. 응답을 받은 후에는 클라이언트에게 전달합니다.
HTTPS 연결
TLS 암호화가 추가되면 문제가 복잡해집니다. 프록시 서버는 클라이언트의 요청을 직접 전달할 수 없습니다. 이는 클라이언트를 대신하여 서버와의 TLS 연결을 설정할 수 없기 때문입니다. 만약 그렇게 한다면, 클라이언트는 TLS 인증서 오류를 감지할 것입니다.
CONNECT 메서드가 이 문제를 해결합니다. GET과 마찬가지로 HTTP 메서드이지만, 연결 설정에 특화되어 있습니다. 작동 방식은 다음과 같습니다:
-
클라이언트가 프록시 서버에 CONNECT 요청을 보냅니다:
CONNECT example.com:443 HTTP/1.1 Host: example.com Proxy-Connection: keep-alive
-
프록시 서버는 요청을 받은 후 대상 서버와 TCP 연결을 설정하고 클라이언트에게 응답합니다:
HTTP/1.1 200 Connection established
프록시 서버는 일반적으로 CONNECT 요청 자체를 대상 서버에 전달하지 않습니다
-
그 후, 프록시 서버는 투명한 TCP 터널이 되어 TCP 패킷을 무조건 전달합니다. 이 시점에서 클라이언트는 TLS 핸드셰이크를 수행하고 HTTPS 데이터를 전송할 수 있습니다. 데이터가 암호화되어 있기 때문에, 프록시 서버는 통신 내용을 보거나 수정할 수 없습니다.
sequenceDiagram participant Client participant Proxy participant Server Client->>Proxy: CONNECT example.com:443 Proxy->>Server: TCP Connection Server->>Proxy: Connection Established Proxy->>Client: HTTP/1.1 200 Connection established Note over Client,Server: TLS Handshake Note over Client,Server: Encrypted Communication
위의 프로세스에서 볼 수 있듯이, CONNECT 메서드는 실제로 TCP 터널을 설정하며 TLS 전용으로 설계된 것이 아닙니다. 따라서 이 터널을 통해 모든 TCP 요청을 전송할 수 있습니다.
전송 계층 프록시는 CONNECT 메서드가 필요한가?
SOCKS5 프록시와 같은 전송 계층(TCP/UDP)에서 작동하는 프록시는 CONNECT 메서드가 필요하지 않습니다. 이는 TCP와 UDP 연결을 직접 처리하고 애플리케이션 계층 프로토콜(HTTP 등)을 이해할 필요가 없기 때문입니다.
클라이언트가 이러한 프록시를 통해 HTTPS 웹사이트에 연결할 때, 프록시 서버는 다음만 수행하면 됩니다:
- 클라이언트의 연결 요청 수신
- 대상 서버와의 TCP 연결 설정
- 두 연결을 브리지