서드 파티 스토리지 액세스를 차단하는 브라우저에서 signInWithRedirect를 사용하기 위한 권장사항

이 문서에서는 서드 파티 쿠키를 차단하는 브라우저에서 리디렉션 로그인을 사용하기 위한 권장사항을 설명합니다. 모든 브라우저 간에 프로덕션 환경에서 signInWithRedirect()가 의도한 대로 작동하려면 여기에 나온 옵션 중 하나를 따라야 합니다.

개요

Firebase 인증 자바스크립트 SDK는 개발자와 사용자가 원활하게 signInWithRedirect() 흐름을 진행할 수 있도록 앱의 Firebase 호스팅 도메인에 연결되는 교차 출처 iframe을 사용합니다. 그러나 서드 파티 스토리지 액세스를 차단하는 브라우저에서는 이 메커니즘이 작동하지 않습니다.

사용자에게 브라우저에서 스토리지 파티션 나누기 기능을 중지하도록 요청할 수 없으므로 대신 사용 사례의 특성에 따라 다음 설정 옵션 중 하나를 앱에 적용해야 합니다.

  • firebaseapp.com의 하위 도메인에서 Firebase 호스팅으로 앱을 호스팅하는 경우에는 이 문제의 영향을 받지 않으며 어떠한 작업도 필요 없습니다.
  • 커스텀 도메인이나 web.app의 하위 도메인에서 Firebase 호스팅으로 앱을 호스팅하는 경우 옵션 1을 사용합니다.
  • Firebase 이외의 서비스로 앱을 호스팅하는 경우에는 옵션 2, 옵션 3, 옵션 4, 옵션 5를 사용합니다.

옵션 1: 커스텀 도메인을 authDomain으로 사용하도록 Firebase 구성 업데이트

커스텀 도메인을 사용하여 Firebase 호스팅으로 앱을 호스팅하는 경우 Firebase SDK를 구성하여 커스텀 도메인을 authDomain으로 사용할 수 있습니다. 이렇게 하면 앱과 인증 iframe에서 같은 도메인을 사용하므로 로그인 문제가 방지됩니다. Firebase 호스팅을 사용하지 않는 경우에는 다른 옵션을 사용해야 합니다. 인증에 사용하는 것과 동일한 프로젝트에 커스텀 도메인을 설정했는지 확인합니다.

커스텀 도메인을 인증 도메인으로 사용하도록 Firebase 구성을 업데이트하려면 다음을 수행합니다.

  1. 커스텀 도메인을 authDomain으로 사용하도록 Firebase JS SDK를 구성합니다.

    const firebaseConfig = {
      apiKey: "<api-key>",
      authDomain: "<the-domain-that-serves-your-app>",
      databaseURL: "<database-url>",
      projectId: "<project-id>",
      appId: "<app-id>"
    };
    
  1. OAuth 제공업체의 승인된 리디렉션 URI 목록에 새 authDomain을 추가합니다. 방법은 제공업체에 따라 다르지만 일반적으로 특정 제공업체의 '시작하기 전에' 섹션의 안내에 따라 정확하게 수행할 수 있습니다(예: Facebook 제공업체). 승인하도록 업데이트된 URI는 https://<the-domain-that-serves-your-app>/__/auth/handler와 같으며 여기서 후행 /__/auth/handler가 중요합니다.

    마찬가지로 SAML 제공업체를 사용하는 경우 새 authDomain을 SAML 어설션 소비자 서비스(ACS) URL에 추가합니다.

  2. continue_uri승인된 도메인 목록에 있는지 확인합니다.

  3. 필요한 경우 Firebase 호스팅으로 다시 배포하여 /__/firebase/init.json에서 호스팅되는 최신 Firebase 구성 파일을 가져옵니다.

옵션 2: signInWithPopup()으로 전환

signInWithRedirect() 대신 signInWithPopup()을 사용합니다. 앱 코드의 나머지 부분은 동일하게 유지되지만 UserCredential 객체는 다르게 검색됩니다.

Web

  // Before
  // ==============
  signInWithRedirect(auth, new GoogleAuthProvider());
  // After the page redirects back
  const userCred = await getRedirectResult(auth);

  // After
  // ==============
  const userCred = await signInWithPopup(auth, new GoogleAuthProvider());

Web

  // Before
  // ==============
  firebase.auth().signInWithRedirect(new firebase.auth.GoogleAuthProvider());
  // After the page redirects back
  var userCred = await firebase.auth().getRedirectResult();

  // After
  // ==============
  var userCred = await firebase.auth().signInWithPopup(
      new firebase.auth.GoogleAuthProvider());
```

사용자에게 팝업 로그인이 항상 적합한 것은 아닙니다. 기기나 플랫폼에서 팝업을 차단하는 경우가 많으며 모바일 사용자의 경우 흐름이 원활하지 않기 때문입니다. 앱에서 팝업을 사용할 수 없으면 다른 옵션 중 하나를 수행해야 합니다.

옵션 3: firebaseapp.com에 프록시 인증 요청

signInWithRedirect 흐름은 앱 도메인에서 Firebase 구성의 authDomain 매개변수에 지정된 도메인으로 리디렉션됩니다(기본적으로 '.firebaseapp.com'). authDomain은 ID 공급업체로 리디렉션되는 로그인 도우미 코드를 호스팅합니다. 성공하면 이 ID는 앱 도메인으로 다시 리디렉션됩니다.

인증 흐름이 앱 도메인으로 돌아오면 로그인 도우미 도메인의 브라우저 스토리지에 액세스합니다. 이 옵션과 다음 옵션(코드 자체 호스팅)은 교차 출처 스토리지 액세스를 제거합니다. 그렇지 않으면 브라우저에 의해 차단됩니다.

  1. https://<app domain>/__/auth/에 대한 GET/POST 요청이 https://<project>.firebaseapp.com/__/auth/에 전달되도록 앱 서버에 역방향 프록시를 설정합니다. 전달이 브라우저에 표시되는지 확인합니다. 이 전달은 302 리디렉션을 통해 실행될 수 없습니다.

    nginx를 사용하여 커스텀 도메인을 제공하는 경우 역방향 프록시 구성은 다음과 같습니다.

    # reverse proxy for signin-helpers for popup/redirect sign in.
    location /__/auth {
      proxy_pass https://<project>.firebaseapp.com;
    }
    
  2. 옵션 1의 단계에 따라 승인된 redirect_uri, ACS URL, authDomain을 업데이트합니다. 앱을 다시 배포하면 더 이상 교차 출처 스토리지에 액세스할 수 없습니다.

옵션 4: 도메인에서 로그인 도우미 코드 자체 호스팅

교차 출처 스토리지 액세스를 제거하는 또 다른 방법은 Firebase 로그인 도우미 코드를 자체 호스팅하는 것입니다. 하지만 이 방법은 Apple 로그인이나 SAML에는 작동되지 않습니다. 옵션 3의 역방향 프록시 설정을 실행할 수 없는 경우에만 이 옵션을 사용하세요.

도우미 코드를 호스팅하는 단계는 다음과 같습니다.

  1. 다음 명령어를 실행하여 <project>.firebaseapp.com 위치에서 호스팅할 파일을 다운로드합니다.

    mkdir signin_helpers/ && cd signin_helpers
    wget https://<project>.firebaseapp.com/__/auth/handler
    wget https://<project>.firebaseapp.com/__/auth/handler.js
    wget https://<project>.firebaseapp.com/__/auth/experiments.js
    wget https://<project>.firebaseapp.com/__/auth/iframe
    wget https://<project>.firebaseapp.com/__/auth/iframe.js
    wget https://<project>.firebaseapp.com/__/firebase/init.json
    
  2. 위 파일을 앱 도메인 아래에서 호스팅합니다. 웹 서버가 https://<app domain>/__/auth/<filename>https://<app domain>/__/firebase/init.json에 응답할 수 있는지 확인합니다.

    다음은 파일을 다운로드하고 호스팅하는 샘플 서버 구현입니다. 최신 버그 수정 및 기능이 적용되도록 정기적으로 파일을 다운로드하고 동기화하는 것이 좋습니다.

  3. 옵션 1의 단계를 수행하여 승인된 redirect_uriauthDomain을 업데이트합니다. 앱을 다시 배포하면 더 이상 교차 출처 스토리지에 액세스할 수 없습니다.

옵션 5: 공급업체 로그인을 개별적으로 처리

Firebase 인증 SDK는 복잡한 로직을 래핑하는 데 편리한 방법으로 signInWithPopup()signInWithRedirect()를 제공하며 다른 SDK를 포함할 필요는 없습니다. 제공업체에 개별적으로 로그인한 후 signInWithCredential()을 사용하여 제공업체의 사용자 인증 정보를 Firebase 인증 사용자 인증 정보로 교환하면 한 메서드를 사용하지 않을 수 있습니다. 예를 들어 Google 로그인 SDK샘플 코드를 사용하여 Google 계정 사용자 인증 정보를 가져온 후 다음 코드를 실행하여 새 Google 사용자 인증 정보를 인스턴스화할 수 있습니다.

Web

  // `googleUser` from the onsuccess Google Sign In callback.
  //  googUser = gapi.auth2.getAuthInstance().currentUser.get();
  const credential = GoogleAuthProvider.credential(googleUser.getAuthResponse().id_token);
  const result = await signInWithCredential(auth, credential);

Web

  // `googleUser` from the onsuccess Google Sign In callback.
  const credential = firebase.auth.GoogleAuthProvider.credential(
      googleUser.getAuthResponse().id_token);
  const result = await firebase.auth().signInWithCredential(credential);

signInWithCredential()을 호출하면 나머지 앱 기능이 이전과 동일하게 작동합니다.

Apple 사용자 인증 정보를 얻는 방법은 여기를 참조하세요.