추가 HTTP 요청 헤더 추가

HTTP 요청에는 User-Agent 또는 Content-Type과 같은 헤더가 포함됩니다. 님이 첨부한 헤더 외에 Android 앱은 EXTRA_HEADERS 인텐트 추가 항목. 보안상의 이유로 Chrome은 일부 추가 헤더를 필터링합니다. 인텐트가 실행되는 방법과 위치에 따라 다릅니다.

교차 출처 요청에는 클라이언트와 서버가 동일하므로 추가 보안 레이어가 필요합니다. 할 수 있습니다. 이 가이드에서는 Chrome을 통해 이러한 요청을 실행하는 방법을 설명합니다. 맞춤 탭, 즉 브라우저 탭에서 URL을 여는 앱에서 실행된 인텐트입니다. Chrome 이전까지 83부터 개발자는 맞춤 탭을 실행할 때 모든 헤더를 추가할 수 있습니다. 버전 83부터 Chrome은 승인되지 않은 헤더로 인해 승인 리스트 크로스 도메인 헤더를 제외한 모든 헤더가 필터링되기 시작함 보안 위험이 있음을 알게 되었습니다. Chrome 86부터 승인되지 않은 헤더를 교차 출처 요청(서버와 클라이언트가 디지털 애셋 링크를 사용하여 관련된 경우) 이 동작은 다음 표에 요약되어 있습니다.

Chrome 버전 CORS 헤더 허용됨
Chrome 83 이전 승인됨(승인됨), 승인 안 함
Chrome 83에서 Chrome 85로 승인 목록에 추가됨
Chrome 86 이상 디지털 애셋 링크가 설정된 경우 승인 목록, 승인 목록에 없음

표 1. 승인되지 않은 CORS 헤더 필터링

이 도움말에서는 서버와 클라이언트 간에 확인된 연결을 설정하고 이를 사용하는 방법을 설명합니다. 를 전송하여 승인 목록에 있는 http 헤더와 승인되지 않은 http 헤더를 모두 전송합니다. 다음으로 건너뛸 수 있습니다. 코드의 맞춤 탭 인텐트에 추가 헤더 추가.

배경

승인 목록 vs. 승인 목록에 없는 CORS 요청 헤더

교차 출처 리소스 공유 (CORS)를 사용하면 한 출처의 웹 애플리케이션에서 요청을 보낼 수 있습니다. 다른 출처의 리소스에 사용할 수 있습니다 CORS 승인 목록 헤더 목록은 HTML 표준. 승인 목록에 포함된 헤더의 예는 다음 표에 나와 있습니다.

헤더 설명
accept-language 고객이 이해하는 자연어 광고
content-language 현재 시청자를 대상으로 하는 언어를 설명함
콘텐츠 유형 리소스의 미디어 유형을 나타냅니다.

표 2. 승인 목록에 포함된 CORS 헤더의 예

승인 목록에 있는 헤더는 민감한 정보를 포함하지 않으므로 안전한 것으로 간주됩니다. 서버에서 잠재적으로 유해한 작업을 수행하지 않게 할 수 있습니다.

승인되지 않은 헤더의 예는 다음 표에 나와 있습니다.

헤더 설명
bearer-token 서버에서 클라이언트 인증
출처 요청의 출처를 나타냅니다.
쿠키 서버에서 설정한 쿠키가 들어 있습니다.

표 3. 승인되지 않은 CORS 헤더의 예

HTML 표준 및 서버에서는 승인되지 않은 헤더를 CORS 요청에 첨부하지 않는 것이 좋습니다. 교차 출처 요청에는 승인된 헤더만 포함되어 있다고 가정합니다. 승인되지 않은 헤더 전송 교차 출처 도메인의 경우 악성 서드 파티 앱이 사용자를 오용하는 헤더를 만들 수 있음 Chrome (또는 다른 브라우저)이 저장하고 요청에 첨부하는 쿠키입니다. 쿠키는 다른 방법으로는 불가능한 악성 서버 트랜잭션을 인증합니다.

커스텀 탭 요청에 CORS 승인 목록 헤더 연결

맞춤 탭은 맞춤설정된 브라우저 탭에서 웹페이지를 실행하는 특별한 방법입니다. 맞춤 탭 인텐트는 CustomTabsIntent.Builder()를 사용하여 만들 수 있습니다. 또한 Browser.EXTRA_HEADERS 플래그와 함께 Bundle를 사용하는 인텐트:

CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();

Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");   
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);

intent.launchUrl(Activity.this, Uri.parse("http://www.google.com"));

언제든지 맞춤 탭의 CORS 요청에 승인 목록에 있는 헤더를 첨부할 수 있습니다. 하지만 Chrome 필터는 기본적으로 승인되어 있지 않습니다. 다른 브라우저에서는 다르게 작동할 수도 있지만 개발자는 일반적으로 승인되지 않은 헤더가 차단될 것을 예상해야 합니다.

맞춤 탭에 승인되지 않은 헤더를 포함하는 데 지원되는 방법은 먼저 디지털 액세스 링크를 사용한 교차 출처 연결 다음 섹션에서는 필요한 헤더와 함께 맞춤 탭 인텐트를 실행하고 실행합니다.

맞춤 탭 인텐트에 추가 헤더 추가

승인되지 않은 헤더가 맞춤 탭 인텐트를 통해 전달되도록 허용하려면 작성자를 확인하는 Android와 웹 애플리케이션 간의 디지털 애셋 링크 실행 두 애플리케이션을 모두 소유합니다

공식 가이드에 따라 디지털 애셋 링크를 설정하세요. 링크 관계의 경우 다음을 사용합니다. 'Delegate_permission/common.use_as_origin'은 두 앱이 동일한 서비스에 속해 있음을 나타냅니다 출처가 표시됩니다.

추가 헤더가 있는 맞춤 탭 인텐트 만들기

맞춤 탭 인텐트를 만드는 방법에는 여러 가지가 있습니다. 사용 가능한 빌더를 사용하여 라이브러리를 빌드 종속 항목에 추가하여 androidX에서 로드합니다.

MULTI_LINE_CODE_PLACEHOLDER_1

인텐트를 빌드하고 헤더를 추가합니다.

MULTI_LINE_CODE_PLACEHOLDER_2

맞춤 탭 연결은 앱과 기기 간 CustomTabsSession Chrome 탭 앱과 웹 앱이 동일한 출처에 속하는지 확인하려면 세션이 필요합니다. 디지털 애셋 링크가 올바르게 설정된 경우에만 인증이 통과됩니다.

CustomTabsClient.warmup()를 호출하는 것이 좋습니다. 이를 통해 브라우저 애플리케이션이 백그라운드에서 미리 초기화하고 URL 열기 프로세스의 속도를 높입니다.

MULTI_LINE_CODE_PLACEHOLDER_3

유효성 검사 후 인텐트를 실행하는 콜백 설정

CustomTabsCallback가 세션에 전달되었습니다. onRelationshipValidationResult(): 이전에 만든 CustomTabsIntent 실행 확인되어야 합니다.

MULTI_LINE_CODE_PLACEHOLDER_4

맞춤 탭 서비스 연결 결합

서비스를 결합하면 서비스 및 연결의 onCustomTabsServiceConnected()가 실행됨 최종적으로 호출됩니다. 서비스를 적절하게 바인딩 해제하는 것을 잊지 마세요. 바인딩 및 바인딩 해제 이 작업은 일반적으로 onStart()onStop() 활동 수명 주기 메서드에서 실행됩니다.

// Bind the custom tabs service connection.
// Call this in onStart()
CustomTabsClient.bindCustomTabsService(this,
    CustomTabsClient.getPackageName(MainActivity.this, null), connection);

// …
// Unbind the custom tabs service.
// Call this in onStop().
unbindService(connection);

데모 애플리케이션 코드

맞춤 탭 서비스에 관한 자세한 내용은 여기를 참고하세요. 자세한 내용은 작동하는 예제 앱의 android-browser-helper GitHub 저장소

요약

이 가이드에서는 커스텀 탭 CORS 요청에 임의 헤더를 추가하는 방법을 설명했습니다. 승인 목록에 있는 헤더는 모든 맞춤 탭 CORS 요청에 첨부할 수 있습니다. 승인되지 않은 헤더는 일반적으로 CORS 요청에서 안전하지 않은 것으로 간주되며 Chrome은 기본적으로 이를 필터링합니다. 첨부파일은 디지털 애셋 링크로 확인된 동일한 출처의 클라이언트와 서버에만 허용됩니다.