요청 헤더 및 응답

리전 ID

REGION_ID는 앱을 만들 때 선택한 리전을 기준으로 Google에서 할당하는 축약된 코드입니다. 일부 리전 ID는 일반적으로 사용되는 국가 및 주/도 코드와 비슷하게 표시될 수 있지만 코드는 국가 또는 주/도와 일치하지 않습니다. 2020년 2월 이후에 생성된 앱의 경우 REGION_ID.r이 App Engine URL에 포함됩니다. 이 날짜 이전에 만든 기존 앱의 경우 URL에서 리전 ID는 선택사항입니다.

리전 ID에 대해 자세히 알아보세요.

이 참조 페이지에서는 App Engine에서 지원되는 HTTP 헤더와 요청 및 응답 한도를 자세히 설명합니다. App Engine이 요청을 수신하고 응답을 전송하는 방법은 요청 처리 방법을 참조하세요.

요청 헤더

수신되는 HTTP 요청에는 클라이언트가 전송한 HTTP 헤더가 포함되어 있습니다. 보안을 위해 일부 헤더는 애플리케이션에 도달하기 전에 중간 프록시에 의해 제거, 수정 또는 삭제됩니다.

수신 요청에서 헤더가 삭제됨

클라이언트가 헤더를 보내면 다음 헤더는 수신 요청에서 삭제됩니다.

  • 헤더의 이름이 X-Google-* 패턴과 일치합니다. 이 이름 패턴은 Google에 예약되어 있습니다.

  • 헤더의 이름이 App Engine 관련 헤더와 일치합니다. 대소문자를 구분하지 않는 일치 항목만 삭제됩니다. 예를 들어 X-Appengine-Country 또는 X-AppEngine-Country라는 헤더는 삭제되지만 X-Appengine-Cntry는 삭제되지 않습니다.

또한 다음 헤더는 클라이언트와 서버 간의 HTTP 데이터 전송과 관련되므로 수신 요청에서 삭제됩니다.

  • Accept-Encoding
  • Connection
  • Keep-Alive
  • Proxy-Authorization
  • TE
  • Trailer
  • Transfer-Encoding

예를 들어 서버는 Accept-Encoding 요청 헤더에 따라 자동으로 gzipped 응답을 보낼 수 있습니다. 애플리케이션 자체는 클라이언트가 어느 콘텐츠 인코딩을 수락할 수 있는지 알 필요가 없습니다.

요청 및 WSGI

서버는 요청의 URL을 앱 구성 파일의 URL 패턴과 비교하여 호출할 Python 애플리케이션 객체를 결정합니다. 그런 다음 서버는 WSGI 표준에 정의된 대로 인수를 사용하여 애플리케이션 객체를 호출합니다. 애플리케이션 객체는 요청에 적합한 작업을 수행한 다음 응답을 준비하여 문자열 목록으로 반환합니다.

대부분의 애플리케이션은 webapp2와 같은 프레임워크를 사용하여 WSGI 요청을 처리합니다. webapp2는 Python 2.7 런타임의 일부로 포함됩니다.

요청 및 CGI

서버는 요청의 URL을 앱 구성 파일의 URL 패턴과 비교하여 실행할 Python 핸들러 스크립트를 결정합니다. 그런 다음 특정 환경에서 요청 데이터가 채워진 스크립트를 실행합니다. CGI 표준에 설명되어 있는 바와 같이, 서버는 요청 데이터를 환경 변수와 표준 입력 스트림에 배치합니다. 스크립트는 요청에 적합한 작업을 수행한 후 응답을 준비하고 표준 출력 스트림에 배치합니다.

대부분의 애플리케이션은 CGI 요청을 구문 분석하여 CGI 응답을 반환하기 위해 Python 표준 라이브러리의 cgi 모듈 같은 라이브러리나 CGI 프로토콜을 인식하는 웹 프레임워크(예: webapp)를 사용합니다. CGI 문서에서 환경 변수와 입력 스트림 데이터의 형식에 관한 자세한 내용을 참조할 수 있습니다.

App Engine 관련 헤더

앱에 대한 서비스로서, App Engine은 다음 헤더를 모든 요청에 추가합니다.

X-Appengine-Country
ISO 3166-1 alpha-2 국가 코드로 표시되는 요청이 시작된 국가입니다. App Engine은 클라이언트의 IP 주소로부터 이 코드를 확인합니다. 국가 정보는 WHOIS 데이터베이스에서 파생되지 않습니다. 따라서 WHOIS 데이터베이스의 국가 정보가 포함된 IP 주소가 X-Appengine-Country 헤더에 국가 정보가 없을 가능성이 있습니다. 애플리케이션은 특수 국가 코드 ZZ(알 수 없는 국가)를 처리해야 합니다.
X-Appengine-Region
요청이 시작된 리전의 이름입니다. 이 값은 X -Appengine-Country에 지정된 국가를 기준으로 적용됩니다. 예를 들어 국가가 'US'이고 지역이 'ca'일 때, 'ca'는 캐나다가 아닌 '캘리포니아'를 의미합니다. 유효한 리전 값의 전체 목록은 ISO-3166-2 표준을 참조하세요.
X-Appengine-City
요청이 시작된 도시의 이름입니다. 예를 들어 Mountain View 시의 요청은 헤더 값 mountain view를 가질 수 있습니다. 이 헤더에 유효한 값의 표준 목록은 없습니다.
X-Appengine-CityLatLong
요청이 시작된 도시의 위도 및 경도입니다. 이 문자열은 Mountain View에서의 요청의 경우 '37.386051,-122.083851'과 같이 표시될 수 있습니다.
X-Cloud-Trace-Context
Cloud TraceCloud Logging에 사용된 요청의 고유 식별자입니다. 모든 App Engine 표준 환경 앱이 자동으로 추적되므로 이 헤더를 중지하거나 trace용 샘플링 레이트를 선택할 수 있는 옵션이 없습니다.
X-Forwarded-For: [CLIENT_IP(s)], [global forwarding rule IP]

클라이언트 요청의 경로를 지정할 때 사용된 쉼표로 구분된 IP 주소 목록입니다. 이 목록의 첫 번째 IP는 일반적으로 요청을 만든 클라이언트의 IP입니다. 이후 IP는 애플리케이션 서버에 도달하기 전 요청을 처리하는 데 사용된 프록시 서버에 대한 정보를 제공합니다. 예를 들면 다음과 같습니다.

X-Forwarded-For: clientIp, proxy1Ip, proxy2Ip
X-Forwarded-Proto [http | https]

클라이언트가 애플리케이션에 연결하는 데 사용한 프로토콜을 기반으로 http 또는 https를 표시합니다.

Google Cloud 부하 분산기는 모든 https 연결을 종료한 후 http을 통해 App Engine 인스턴스로 트래픽을 전달합니다. 예를 들어 사용자가 https://PROJECT_ID.REGION_ID.r.appspot.com를 통해 사이트에 대한 액세스를 요청하면 X-Forwarded-Proto 헤더 값은 https가 됩니다.

또한 App Engine은 App Engine에서 내부적으로 사용하는 다음 헤더를 설정할 수 있습니다.

  • X-Appengine-Https
  • X-Appengine-User-IP
  • X-Appengine-Api-Ticket
  • X-Appengine-Request-Log-Id
  • X-Appengine-Default-Version-Hostname
  • X-Appengine-Timeout-Ms
App Engine 서비스에서 요청 헤더를 추가할 수도 있습니다.

  • app.yaml에 지정된 login:admin 또는 login:required 핸들러의 경우 App Engine은 다음 헤더 집합을 추가합니다.

    • X-Appengine-User-Email, 헤더 예: 'ange@example.com'
    • X-Appengine-Auth-Domain ,헤더 예: 'example.com'
    • X-Appengine-User-ID, 헤더 예: '100979712376541954724'
    • X-Appengine-User-Nickname, 헤더 예: 'ange'
    • X-Appengine-User-Organization, 헤더 예: 'example.com'
    • X-Appengine-User-Is-Admin, 헤더 예: '1'
  • 태스크 큐 서비스가 요청에 추가하는 헤더는 요청의 작업 및 관련 대기열에 대한 세부정보를 제공합니다.

  • 크론 서비스의 요청은 다음 헤더를 추가합니다.

    X-Appengine-Cron: true

    자세한 내용은 크론 URL 보안을 참조하세요.

  • 요청하는 앱이 URL Fetch 서비스를 사용하는 경우 다른 App Engine 애플리케이션에서 시작되는 요청에는 요청하는 앱을 식별하는 헤더가 포함됩니다.

    X-Appengine-Inbound-Appid

    자세한 내용은 앱 ID 문서를 참조하세요.

요청 응답

이 HTTP 헤더 문서는 수신 HTTP 요청에 대한 응답에만 적용됩니다. 응답은 클라이언트에 반환되기 전에 수정될 수 있습니다. App Engine 코드에서 시작되는 발신 요청과 관련한 HTTP 헤더에 대해서는 URLFetch 헤더 문서를 참조하세요.

삭제되는 헤더

다음 헤더는 무시되며 응답에서 삭제됩니다.

  • Connection
  • Content-Encoding*
  • Content-Length
  • Date
  • Keep-Alive
  • Proxy-Authenticate
  • Server
  • Trailer
  • Transfer-Encoding
  • Upgrade

* App Engine에서 응답을 압축한다면 다시 추가될 수 있습니다.

이름이나 값에 ASCII가 아닌 문자가 포함된 헤더도 삭제됩니다.

추가 또는 대체되는 헤더

다음 헤더는 응답에 추가되거나 대체됩니다.

Cache-Control, Expires, Vary

이 헤더는 Google 프런트엔드 및 인터넷 서비스 제공업체(ISP) 같은 중간 웹 프록시와 브라우저에 캐시 정책을 지정합니다. 앱에서 이러한 헤더를 설정할 경우 보통은 헤더가 수정되지 않지만, 앱에 Set-Cookie 헤더가 있거나 관리자 계정으로 로그인한 사용자를 위해 응답이 생성된 경우는 예외입니다.

앱에 Set-Cookie 응답 헤더가 설정되어 있는 경우 Cache-Control 헤더는 private(이미 더 제한적이지 않은 경우)로 설정되며, Expires 헤더는 현재 날짜로 설정됩니다(과거에 이미 설정되지 않은 경우). 이렇게 되면 일반적으로 브라우저는 응답을 캐시하지만 중간 프록시 서버는 응답을 캐시하지 않습니다. 이는 보안을 위한 것으로, 응답이 공개적으로 캐시되면 다른 사용자가 이후에 동일한 리소스를 요청하여 최초 사용자의 쿠키를 획득할 위험이 있기 때문입니다.

webob 기반 프레임워크(예: webapp 또는 webapp2)를 사용하는 경우 프레임워크는 기본적으로 Cache-Control 헤더를 no-cache로 설정하므로 스크립트 핸들러에서 캐싱을 하려면 이를 재정의해야 합니다.

앱이 Cache-Control 응답 헤더를 설정하지 않으면 서버에서 응답 헤더를 private으로 설정하고 Vary: Accept-Encoding 헤더를 추가할 수 있습니다.

Google 프런트엔드에서 지원하는 Vary 값 목록을 비롯해 캐싱에 대한 자세한 내용은 응답 캐싱을 참조하세요.

Content-Encoding

요청 헤더와 응답의 Content-Type에 따라서는 서버가 위의 설명과 같이 응답 본문을 자동으로 압축할 수 있습니다. 이 경우 Content-Encoding: gzip 헤더를 추가하여 본문이 압축되었음을 나타냅니다. 자세한 내용은 응답 압축 섹션을 참조하세요.

Content-Length 또는 Transfer-Encoding

서버는 항상 애플리케이션에서 반환된 Content-Length 헤더를 무시합니다. 압축 후 Content-Length를 본문의 길이(압축된 경우 압축 후 길이)로 설정하거나, Content-Length를 삭제하고 분할 전송 인코딩을 사용하여 Transfer-Encoding: chunked 헤더를 추가합니다.

Content-Type

애플리케이션에서 지정하지 않으면 서버에서 기본값인 Content-Type: text/html 헤더를 설정합니다.

Date

현재 날짜와 시간으로 설정합니다.

Server

Google Frontend로 설정합니다. 개발 서버에서는 이 값을 Development/x로 설정합니다. 여기서 x는 버전 번호입니다.

관리자 계정으로 로그인한 상태에서 사이트의 동적 페이지에 액세스하면 App Engine은 응답 헤더에 요청별 통계를 넣습니다.

X-Appengine-Resource-Usage
요청에 사용된 리소스로서 서버 측 시간(밀리초)이 포함됩니다.

리소스 사용 통계를 포함하는 응답은 캐시할 수 없습니다.

애플리케이션의 응답에 X-Appengine-BlobKey 헤더가 있는 경우, 본문을 blobstore blob 콘텐츠의 전체 또는 일부로 교체할 때 이 헤더와 선택사항인 X-Appengine-BlobRange 헤더가 사용됩니다. 애플리케이션에서 Content-Type을 지정하지 않으면 blob의 MIME 유형으로 설정됩니다. 범위가 요청되면 응답 상태가 206 Partial Content로 변경되고 Content-Range 헤더가 추가됩니다. X-Appengine-BlobKeyX-Appengine-BlobRange 헤더는 응답에서 삭제됩니다. blobstore_handlers.BlobstoreDownloadHandler 클래스가 헤더를 설정하므로 일반적으로 이러한 헤더는 직접 설정할 필요가 없습니다. 자세한 내용은 blob 제공을 참조하세요.

애플리케이션 구성에서 설정하는 응답 헤더

애플리케이션의 구성 파일에 동적 및 정적 경로의 URL별로 커스텀 HTTP 응답 헤더를 설정할 수 있습니다. 자세한 내용은 구성 문서http_headers 섹션을 참조하세요.