HTTP 요청을 HTTPS로 리디렉션

이 예시에서는 URL 맵 리디렉션을 사용하여 모든 요청을 HTTP에서 HTTPS로 리디렉션하는 방법을 보여줍니다. 이 예시에서는 잘 알려진 포트인 80(HTTP) 및 443(HTTPS)을 사용하여 리디렉션을 설정하는 방법을 보여줍니다. 하지만 이러한 특정 포트 번호를 사용할 필요는 없습니다. 애플리케이션 부하 분산기의 각 전달 규칙은 1~65535 범위의 단일 포트를 참조할 수 있습니다.

HTTPS는 TLS(SSL)를 사용하여 HTTP 요청과 응답을 암호화하므로 더 안전하고 보안성이 높습니다. HTTPS를 사용하는 웹사이트의 URL은 시작 부분에 http:// 대신 https://를 사용합니다.

새 HTTPS 애플리케이션 부하 분산기

새 HTTPS 애플리케이션 부하 분산기를 만드는 경우 Google Cloud 콘솔을 사용하여 HTTP-HTTPS 리디렉션을 설정할 수 있습니다.

부하 분산기의 프런트엔드를 만드는 동안 다음 단계를 사용합니다.

  1. Google Cloud 콘솔에서 부하 분산기의 구성 페이지로 이동합니다.

    부하 분산으로 이동(전역 외부 애플리케이션 부하 분산기 만들기)

  2. 부하 분산기 이름에 이름을 입력합니다.
  3. 프런트엔드 구성을 클릭합니다.
  4. 프로토콜에서 HTTPS(HTTP/2 포함)를 선택합니다.
  5. IP 주소에서 IP 주소 만들기를 클릭합니다. 새로운 고정 IP 주소의 이름을 입력하고 예약을 클릭합니다.
  6. 인증서에 대해 SSL 인증서를 선택합니다.
  7. 리디렉션을 만들려면 HTTP-HTTPS간 리디렉션 사용 설정 체크박스를 선택합니다.
  8. 완료를 클릭합니다.
  9. 백엔드 및 기타 필수 구성을 완료합니다.
  10. 만들기를 클릭합니다.

체크박스를 선택할 수 있으려면 HTTPS 프로토콜을 선택하고 예약된 IP 주소(임시 아님)를 사용해야 합니다.

Google Cloud 콘솔의 HTTP-HTTPS 간 리디렉션 체크박스
그림 1. Google Cloud 콘솔의 HTTP-HTTPS 간 리디렉션 체크박스(확대하려면 클릭)

백엔드 유형에 따라 다음 가이드 중 하나의 Google Cloud 콘솔 안내를 따라 이 설정을 완료합니다.

HTTP-HTTPS 리디렉션 체크박스를 설정하면 URL 맵, 전달 규칙, 대상 HTTP 프록시로 구성되는 부분 HTTP 부하 분산기가 추가로 자동으로 생성됩니다. 이러한 부분 HTTP 부하 분산기는 HTTPS 부하 분산기와 동일한 IP 주소를 사용하고 HTTP 요청을 부하 분산기의 HTTPS 프런트엔드로 리디렉션합니다. 301 Moved Permanently를 기본 리디렉션 응답 코드로 사용합니다.

HTTPS 부하 분산기가 생성된 다음 부하 분산기 목록에서 -redirect 서픽스와 함께 부분 HTTP 부하 분산기를 볼 수 있습니다. HTTP-HTTPS 리디렉션 테스트의 단계에 따라 설정을 테스트합니다.

기존 부하 분산기

포트 443으로 HTTPS 트래픽을 제공하는 HTTPS 애플리케이션 부하 분산기(여기서는 LB1이라고 함)가 이미 있으면 다음 설정에 따라 부분 LB1 애플리케이션 부하 분산기(LB1)를 만들어야 합니다.

  • LB1에서 사용하는 것과 동일한 프런트엔드 IP 주소
  • URL 맵에 구성된 리디렉션

이러한 부분 HTTP 부하 분산기는 HTTPS 부하 분산기와 동일한 IP 주소를 사용하고 HTTP 요청을 부하 분산기의 HTTPS 프런트엔드로 리디렉션합니다.

이 아키텍처는 다음 다이어그램에 나와 있습니다.

HTTP-HTTPS 리디렉션 구성 아키텍처.
그림 2. HTTP-HTTPS 간 리디렉션 구성 아키텍처(확대하려면 클릭)

HTTPS 부하 분산기로 트래픽 리디렉션

HTTPS 부하 분산기(LB1)가 작동하는지 확인한 후 프런트엔드를 사용하여 트래픽을 LB1로 리디렉션하도록 부분 HTTP 부하 분산기(LB2)를 만들 수 있습니다.

이 예시에서는 301 응답 코드를 사용합니다. 다른 응답 코드를 대신 사용할 수 있습니다.

gcloud로 리디렉션을 구성하려면 YAML 파일을 가져오고 대상 HTTP 프록시가 트래픽을 리디렉션하는 URL 맵을 가리키는지 확인해야 합니다. Google Cloud 콘솔을 사용하는 경우 이 작업이 자동으로 수행됩니다.

Google Cloud 콘솔에서는 리전 외부 애플리케이션 부하 분산기가 지원되지 않습니다.

gcloud

  1. YAML 파일 /tmp/web-map-http.yaml을 만듭니다. 이 예시에서는 MOVED_PERMANENTLY_DEFAULT를 응답 코드로 사용합니다.
  2.        kind: compute#urlMap
           name: web-map-http
           defaultUrlRedirect:
             redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
             httpsRedirect: True
           tests:
           - description: Test with no query parameters
             host: example.com
             path: /test/
             expectedOutputUrl: https://example.com/test/
             expectedRedirectResponseCode: 301
           - description: Test with query parameters
             host: example.com
             path: /test/?parameter1=value1&parameter2=value2
             expectedOutputUrl: https://example.com/test/?parameter1=value1&parameter2=value2
             expectedRedirectResponseCode: 301
           
  3. URL 맵의 유효성을 검사합니다.
  4.        gcloud compute url-maps validate --source /tmp/web-map-http.yaml
           

    테스트를 통과하고 명령어가 성공 메시지를 출력하면 변경사항을 URL 맵에 저장합니다.

  5. YAML 파일을 가져와 HTTP 부하 분산기의 URL 맵을 만듭니다. 이 URL 맵의 이름은 web-map-http입니다.
  6.        gcloud compute url-maps import web-map-http \
               --source /tmp/web-map-http.yaml \
               --global
           

    기존 URL 맵을 업데이트하면 다음 메시지가 표시됩니다.

           Url Map [web-map-http] will be overwritten.
    
           Do you want to continue (Y/n)?
           

    계속하려면 Y를 누릅니다.

  7. URL 맵이 업데이트되었는지 확인합니다. HTTP 부하 분산기의 URL 맵은 다음과 비슷합니다.
  8.        gcloud compute url-maps describe web-map-http
           
           creationTimestamp: '2020-03-23T10:53:44.976-07:00'
           defaultUrlRedirect:
             httpsRedirect: true
             redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
           fingerprint: 3A5N_RLrED8=
           id: '2020316695093397831'
           kind: compute#urlMap
           name: web-map-http
           selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
           
  9. web-map-http를 URL 맵으로 사용하여 새 대상 HTTP 프록시를 만들거나 기존 대상 HTTP 프록시를 업데이트합니다.
  10.        gcloud compute target-http-proxies create http-lb-proxy \
               --url-map=web-map-http \
               --global
           
    또는
            gcloud compute target-http-proxies update http-lb-proxy \
               --url-map=web-map-http \
               --global
           
  11. 수신 요청을 프록시로 라우팅하는 전달 규칙을 만듭니다. --address 플래그는 외부 HTTPS 부하 분산기에 사용되는 IP 주소와 동일한 IP 주소인 lb-ipv4-1을 지정합니다.
  12.        gcloud compute forwarding-rules create http-content-rule \
               --load-balancing-scheme=EXTERNAL_MANAGED \
               --address=lb-ipv4-1 \
               --network-tier=PREMIUM \
               --global \
               --target-http-proxy=http-lb-proxy \
               --ports=80
           

커스텀 HSTS 헤더 추가

HTTP Strict-Transport-Security 헤더를 HTTPS 부하 분산기의 백엔드 서비스에 추가하면 다음에 클라이언트가 HTTP를 통해 URL에 액세스하려고 할 때 브라우저에서 요청을 리디렉션하도록 부하 분산기가 커스텀 헤더를 클라이언트에 보냅니다. 헤더 설정은 다음과 같습니다.

  • 헤더 이름: Strict-Transport-Security
  • 헤더 값: max-age=31536000; includeSubDomains; preload

백엔드 서비스 구성에 커스텀 헤더를 추가하려면 --custom-response-header 플래그를 사용합니다.

gcloud compute backend-services update BACKEND_SERVICE_NAME_LB1 \
    --global \
    --custom-response-header='Strict-Transport-Security:max-age=31536000; includeSubDomains; preload'

자세한 내용은 커스텀 헤더 만들기를 참조하세요.

HTTP-HTTPS 간 리디렉션 테스트

두 부하 분산기 모두에서 사용하는 예약된 IP 주소를 기록합니다.

gcloud compute addresses describe lb-ipv4-1 
--format="get(address)"
--global

이 예시에서는 예약된 IP 주소가 34.98.77.106이라고 가정합니다. http://34.98.77.106/ URL은 https://34.98.77.106/으로 리디렉션됩니다.

몇 분이 지난 후에 다음 curl 명령어를 실행하여 테스트할 수 있습니다.

curl -v http://hostname.com

샘플 결과:

* Connected to 34.98.77.106 (34.98.77.106) port 80 (#0)
> GET / HTTP/1.1
> Host: hostname.com
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Cache-Control: private
< Content-Type: text/html; charset=UTF-8
< Referrer-Policy: no-referrer
< Location: https://hostname.com
< Content-Length: 220
< Date: Fri, 30 Jul 2021 21:32:25 GMT
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://hostname.com">here</A>.
</BODY></HTML>
* Connection #0 to host hostname.com left intact