이번 포스팅은 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" />
'개발 경험 기록 > 클라우드 및 인프라' 카테고리의 다른 글
네이버 클라우드 플랫폼 자격증 Tip (NCA, NCP, NCE) (5) | 2023.07.21 |
---|