본문 바로가기
클라우드 및 인프라

로드밸런싱 시 X-forwarded-proto 설정

by 시니성 2023. 8. 4.

이번 포스팅은 Naver Cloud 개발자 양성과정 메인 프로젝트 때 가장 고생했던 부분 중 하나인 X-Forwarded-Proto(XFP)관련 포스팅입니다.

발생한 문제 정의

1. 메인 프로젝트 때 정의한 요구사항 대로 사용자는 GPS 위치정보를 기반으로 주변의 모임을 
   검색할 수 있어야 한다.
2. GPS위치 정보에 대한 접근은 HTTPS 프로토콜을 요구한다.
3. 로드밸런서에 Domain Name을 할당하고 SSL 인증까지 하여 HTTPS 요청을 처리할 수 있었지만, 
   로드밸런서와 타겟 그룹간의 HTTP 통신이 제대로 이루어 지지않는 문제가 발생했다

 

위 문제는 XFP 관련 설정을 해주는 것으로 해결되었습니다.

아래는 XFP의 개념과 타겟 그룹 서버의 설정 관련된 내용입니다.

 

X-Forwarded-Proto (XFP)는 일반적으로 HTTP 헤더 필드로, 요청이 클라이언트에서 프록시 서버를 거쳐 웹 서버에 도달하기 전에 사용한 프로토콜을 지정합니다. 일반적으로 이 헤더는 로드 밸런서나 프록시 서버에 의해 설정되며, 최초의 요청이 HTTP를 사용했는지, 아니면 보안이 강화된 HTTPS를 사용했는지를 나타냅니다.

X-Forwarded-Proto의 값은 'http' 또는 'https'가 될 수 있습니다. 예를 들어, 사용자가 HTTPS를 통해 프록시에 접속했지만 프록시가 웹 서버에게는 HTTP를 통해 요청을 전달하는 경우, 프록시는 원래의 HTTPS 연결을 추적하기 위해 이 헤더를 사용할 수 있습니다.

Naver Cloud L7(어플리케이션) 로드밸런서의 경우 헤더에서 X-Forwarded 필드를 사용하기 때문에  하단의 웹 서버에 다음과 같은 설정을 해 주어야 합니다. 

 

1. 프록시 헤더 처리:

네이버 클라우드 플랫폼의 어플리케이션 로드 밸런서는 HTTPS 요청을 HTTP로 변환할 때 X-Forwarded-* 헤더를 추가합니다.

이 헤더는 원래 클라이언트의 요청 정보를 포함하며, 애플리케이션 로직에 따라 이 정보가 필요할 수 있습니다.

Tomcat이 이 헤더를 올바르게 해석하려면 RemoteIpValve 설정이 필요합니다

 

server.xml 설정

<Valve className="org.apache.catalina.valves.RemoteIpValve"
       internalProxies="127\.0\.0\.1"
       remoteIpHeader="x-forwarded-for"
       proxiesHeader="x-forwarded-by"
       protocolHeader="x-forwarded-proto"
       httpsServerPort="443" />

 

2. 변환된 HTTP 요청을 수신하도록 처리 : Tomcat 설정에서 scheme="https"와 secure="true"를 사용하면, Tomcat은 들어오는 연결이 HTTPS를 사용하여 암호화되었음을 가정합니다.

이는 일반적으로 Tomcat이 직접 SSL/TLS를 처리할 때 사용됩니다.

그러나 로드 밸런서나 리버스 프록시가 SSL/TLS를 처리하고 Tomcat에는 HTTP 요청만 전달하는 경우에는 scheme="http" 및 secure="false"를 설정해야 합니다.

이렇게 하면, Tomcat은 연결이 이미 로드 밸런서나 리버스 프록시에서 암호화 해제되었으므로 들어오는 연결이 암호화되지 않은 HTTP 요청임을 알 수 있습니다.

 

server.xml 설정

<Connector port="8080" protocol="HTTP/1.1"
       connectionTimeout="20000"
       redirectPort="8443"
       scheme="http" secure="false" />