HTTP에서 HTTPS로 리디렉션 설정

이 예시에서는 URL 리디렉션을 사용하여 포트 80(HTTP)에서 포트 443(HTTPS)로 모든 요청을 리디렉션하는 방법을 보여줍니다.

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

아키텍처

HTTP 트래픽을 HTTPS로 리디렉션하려면 다음을 수행해야 합니다.

  1. (기본 요건) 이미 포트 443에서 HTTPS 트래픽을 제공하는 외부 HTTPS 부하 분산기(여기서는 LB1이라고 함)가 있어야 합니다.
  2. 부분 외부 HTTP 부하 분산기(여기서 LB2라고 함)를 만듭니다. LB2 설정에는 다음이 포함됩니다.

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

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

HTTP-HTTPS 간 리디렉션 구성(확대하려면 클릭)
HTTP-HTTPS 간 리디렉션 구성

기본 요건: 외부 HTTPS 부하 분산기(LB1) 설정

아직 외부 HTTPS 부하 분산기를 구성하지 않았으면 다음 가이드 중 하나를 사용하여 설정을 완료합니다. 백엔드 유형에 대한 프로시져를 선택합니다.

작동 중인 HTTPS 부하 분산기가 있으면 HTTPS 부하 분산기로 트래픽 리디렉션으로 곧바로 넘어가세요.

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

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

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

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

Console

구성 시작

  1. Google Cloud Console에서 부하 분산 페이지로 이동합니다.

    부하 분산으로 이동

  2. HTTP(S) 부하 분산 아래에서 구성 시작을 클릭합니다.
  3. 인터넷 트래픽을 VM으로 분산을 선택하고 계속을 클릭합니다.
  4. 부하 분산기 이름http-redirect 같은 이름을 입력합니다.
  5. 계속하려면 창을 열어둡니다.

백엔드 구성 건너뛰기

  1. 백엔드 구성 섹션을 건너뜁니다.
    이 부하 분산기에는 백엔드가 필요 없습니다.

URL 맵에서 리디렉션 구성

  1. 화면의 왼쪽 열에서 호스트 및 경로 규칙을 클릭합니다.
  2. 고급 호스트 및 경로 규칙(URL 리디렉션, URL 재작성)을 선택합니다.
  3. 작업에서 다른 호스트/경로로 클라이언트 리디렉션을 선택합니다.
  4. 프리픽스 리디렉션 필드는 비워둡니다.
  5. 경로 리디렉션에서 프리픽스 리디렉션을 선택합니다.
  6. 경로 값 필드는 비워둡니다.
  7. 리디렉션 응답 코드에서 301-영구 이전을 선택합니다.
  8. HTTPS 리디렉션에서 사용 설정을 선택합니다.
  9. 완료를 클릭합니다.
  10. 계속하려면 부하 분산기 구성 페이지를 열어 둡니다.

LB1에 사용된 것과 동일한 IP 주소로 HTTP 전달 규칙 구성

  1. 부하 분산기 구성 페이지에서 프런트엔드 구성을 클릭합니다.
  2. 프로토콜HTTP로 설정합니다.
  3. IP 주소를 HTTPS 부하 분산기에 사용한 IP 주소와 동일한 IP 주소로 설정합니다.
  4. HTTP 트래픽을 허용하려면 포트80으로 설정되어 있는지 확인합니다.
  5. 완료를 클릭합니다.
  6. 계속하려면 창을 열어둡니다.

구성 검토

  1. 왼쪽 패널에서 검토 및 완료를 클릭합니다.
  2. 만들려던 설정과 현재 설정을 비교합니다.
  3. 모든 설정이 올바른 것으로 확인되면 만들기를 클릭합니다.

gcloud

  1. YAML 파일 /tmp/web-map-http.yaml을 만듭니다. 이 예시에서는 응답 코드로 MOVED_PERMANENTLY_DEFAULT를 사용합니다.

    kind: compute#urlMap
    name: web-map-http
    defaultUrlRedirect:
      redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
      httpsRedirect: True
    tests:
    - description: Test with no query parameters
      host: foobar
      path: /test/
      expectedOutputUrl: https://foobar/test/
      expectedRedirectResponseCode: 301
    - description: Test with query parameters
      host: foobar
      path: /test/?parameter1=value1&parameter2=value2
      expectedOutputUrl: https://foobar/test/?parameter1=value1&parameter2=value2
      expectedRedirectResponseCode: 301
    
  2. URL 맵의 유효성을 검사합니다.

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

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

  3. YAML 파일을 가져와 HTTP 부하 분산기의 URL 맵을 만듭니다. 이 URL 맵의 이름은 web-map-http입니다.

    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를 누릅니다.

  4. URL 맵이 업데이트되었는지 확인합니다. HTTP 부하 분산기의 URL 맵은 다음과 비슷합니다.

    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
    
  5. URL 맵으로 web-map-http를 사용하여 새 대상 HTTP 프록시를 만들거나 기존 대상 HTTP 프록시를 업데이트합니다.

    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
    
  6. 들어오는 요청을 프록시로 라우팅하는 전역 전달 규칙을 만듭니다. --address 플래그는 외부 HTTPS 부하 분산기에 사용되는 IP 주소와 동일한 IP 주소인 lb-ipv4-1을 지정합니다.

    gcloud compute forwarding-rules create http-content-rule \
       --address=lb-ipv4-1 \
       --global \
       --target-http-proxy=http-lb-proxy \
       --ports=80
    

완료되면 Cloud Console에 다음과 같이 두 개의 부하 분산기가 표시됩니다.

두 부하 분산기 모두

Cloud Console에 다음과 같이 web-map-http 부하 분산기에 대한 정보가 표시됩니다.

HTTP 부하 분산기

커스텀 헤더 추가

선택적으로 HTTP Strict-Transport-Security 헤더를 HTTPS 부하 분산기의 백엔드 서비스에 다음과 같이 추가합니다.

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

이 설정은 클라이언트가 HTTP를 통해 URL에 액세스하려고 할 때 브라우저가 리디렉션을 수행하도록 커스텀 헤더를 클라이언트에 보냅니다.

백엔드 서비스 구성에 커스텀 헤더를 추가하려면 다음과 같이 --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