Firestore로 세션 처리


대부분의 앱에는 인증 및 사용자 환경설정에 대한 세션 관리가 필요합니다. 분산 캐시에 세션을 저장하기 위해 ASP.NET Core가 미들웨어와 함께 제공됩니다.

ASP.NET의 기본 분산 캐시는 실제로 전혀 분산되지 않습니다. 웹 서버의 메모리에 세션 데이터를 저장합니다. 웹 서버 하나가 웹 사이트를 제공하는 경우에는 이 전략이 좋습니다. 하지만 여러 웹 서버가 웹 사이트를 제공하는 경우, 웹 사이트 사용자에게 오류 및 데이터 손실이 발생할 수 있습니다.

오류 및 데이터 손실을 방지하려면 ASP.NET 앱에서 영구 데이터 저장소에 데이터를 저장하는 분산 캐시를 사용해야 합니다. 이 가이드에서는 Firestore에 세션을 저장하고 Cloud Key Management Service로 쿠키를 암호화하여 Cloud Run에서 세션을 관리하는 방법을 보여줍니다.

목표

  • Cloud Run에 앱을 배포합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. Enable the Firestore, Cloud Run, Cloud Key Management Service, and Cloud Storage APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. Enable the Firestore, Cloud Run, Cloud Key Management Service, and Cloud Storage APIs.

    Enable the APIs

  8. 기본 모드로 Firestore 데이터베이스를 만들려면 다음 단계를 완료하세요.
    1. Google Cloud 콘솔에서 Firestore 뷰어 페이지로 이동합니다.
      Firestore 뷰어로 이동
    2. Firestore 모드 선택 화면에서 기본 모드 선택을 클릭합니다.
    3. Firestore 데이터베이스의 위치를 선택합니다. 이 위치 설정은 Google Cloud 프로젝트의 기본 Google Cloud 리소스 위치입니다. 이 위치는 위치 설정이 필요한 Google Cloud 프로젝트, 특히 기본 Cloud Storage 버킷 및 App Engine 앱의 Google Cloud 서비스에 사용됩니다.
    4. 데이터베이스 만들기를 클릭합니다.
  9. Cloud Shell에서 앱의 소스 코드를 엽니다.
    Cloud Shell로 이동

    Cloud Shell을 사용하면 브라우저에서 직접 명령줄을 통해 Google Cloud 리소스에 액세스할 수 있습니다.

  10. 샘플 코드를 다운로드하고 앱 디렉터리로 변경하려면 계속을 클릭합니다.
  11. 새 Google Cloud 프로젝트를 사용하도록 Cloud Shell에서 gcloud CLI를 구성합니다.

    # Configure gcloud for your project
    gcloud config set project PROJECT_ID

    PROJECT_ID를 Google Cloud Console을 사용하여 만든 Google Cloud 프로젝트 ID로 바꿉니다.

    Google Cloud CLI는 명령줄에서 Google Cloud 리소스와 상호작용하는 주요 수단입니다. 이 튜토리얼에서는 gcloud CLI를 사용하여 앱을 배포하고 모니터링합니다.

소스 코드 검사

다음 다이어그램에서는 Firestore가 Cloud Run 앱의 세션을 처리하는 방법을 보여줍니다.

아키텍처 다이어그램: 사용자, Cloud Run, Firestore

Startup.cs 파일의 ConfigureServices 메서드는 암호화에 Cloud KMS를 사용하고 암호화된 키를 저장하는 데 Cloud Storage를 사용하도록 앱을 설정합니다.

  1. Cloud Shell에서 편집기 시작을 클릭하여 편집기를 실행하고 Startup.cs 파일을 검사합니다.

    public void ConfigureServices(IServiceCollection services)
    {
        // Antiforgery tokens require data protection.
        services.AddDataProtection()
            // Store keys in Cloud Storage so that multiple instances
            // of the web application see the same keys.
            .PersistKeysToGoogleCloudStorage(
                Configuration["DataProtection:Bucket"],
                Configuration["DataProtection:Object"])
            // Protect the keys with Google KMS for encryption and fine-
            // grained access control.
            .ProtectKeysWithGoogleKms(
                Configuration["DataProtection:KmsKeyName"]);
        services.AddFirestoreDistributedCache(
                Configuration["FIRESTORE_PROJECT_ID"])
            .AddFirestoreDistributedCacheGarbageCollector();
        services.AddSession();
    }
    

Google Cloud 프로젝트 설정

  1. Cloud Shell 편집기에서 appsettings.json 파일을 편집하고 YOUR-PROJECT-ID의 두 인스턴스를 Google Cloud 프로젝트 ID로 바꿉니다. 파일을 저장합니다.

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*",
      "DataProtection": {
        "Bucket": "YOUR-PROJECT-ID-bucket",
        "Object": "DataProtectionProviderKeys.xml",
        "KmsKeyName": "projects/YOUR-PROJECT-ID/locations/global/keyRings/dataprotectionprovider/cryptoKeys/masterkey"
      }
    }
    
  2. 이름이 dataprotectionprovider인 새 Cloud Key Management Service 키링을 만듭니다.

    gcloud kms keyrings create dataprotectionprovider --location global

  3. 이름이 masterkey인 Cloud Key Management Service 키를 만듭니다.

    gcloud kms keys create masterkey --location global --keyring dataprotectionprovider --purpose=encryption

  4. 암호화된 키를 저장할 Cloud Storage 버킷을 만듭니다.

    gsutil mb gs://PROJECT_ID-bucket

Cloud Run에서 배포 및 실행

Cloud Run을 사용하여 많은 양의 데이터를 사용해 작업하고 과도한 부하가 발생하는 앱을 빌드 및 배포할 수 있습니다.

이 가이드에서는 Cloud Run을 사용하여 서버를 배포합니다.

  1. Cloud Shell에서 앱을 게시합니다.

    dotnet publish -c Release
    
  2. Cloud Build를 사용하여 Docker 컨테이너를 빌드하고 Container Registry에 게시합니다.

    gcloud builds submit --tag gcr.io/PROJECT_ID/sessions bin/Release/netcoreapp2.1/publish

  3. Cloud Run으로 컨테이너를 실행합니다.

    gcloud beta run deploy sessions --region us-central1 --platform managed --image gcr.io/PROJECT_ID/sessions --allow-unauthenticated

    출력의 URL을 기록해 둡니다.

    Service [sessions] revision [sessions-00003-xiz] has been deployed and is serving
    100 percent of traffic at https://sessions-r3f3em7nuq-uc.a.run.app
  4. 라이브 앱을 보려면 이전 단계에서 복사해 둔 URL로 이동합니다.

세션 삭제

Google Cloud Console에서 세션 데이터를 삭제하거나 자동 삭제 전략을 구현할 수 있습니다. Memcache 또는 Redis와 같은 세션에 대한 스토리지 솔루션을 사용할 경우 만료된 세션이 자동으로 삭제됩니다.

앱 디버깅

Cloud Run 앱에 연결할 수 없는 경우 다음 사항을 확인하세요.

  1. gcloud 배포 명령어가 성공적으로 완료되었고 오류를 출력하지 않았는지 확인합니다. 오류가 있으면(예: message=Build failed) 오류를 수정하고 Cloud Run 앱 배포를 다시 시도합니다.
  2. 로그 보기에 대한 Cloud Run 가이드를 참조하세요.

삭제

프로젝트 삭제

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

다음 단계