인증 개요

이 페이지에서는 애플리케이션 개발자를 대상으로 Google Cloud의 플랫폼(이전의 Google Cloud Platform 또는 GCP)에서의 인증을 간략하게 설명합니다. 여기서는 주 구성원, 애플리케이션 사용자 인증 정보, Google Cloud APIs 호출을 인증하는 다양한 방법을 설명합니다.

소개

Google Cloud APIs의 액세스 제어에는 인증, 승인, 감사가 포함됩니다. 인증은 사용자의 신원을 확인하고 승인은 사용자의 작업 범위를 결정하며 수행한 작업의 로그를 감사합니다.

이 페이지에서는 인증을 중점적으로 설명합니다. 승인은 ID 및 액세스 관리(IAM)를 참조하세요. 감사는 Cloud 감사 로그를 참조하세요.

주 구성원

주 구성원은 리소스에 대한 액세스 권한을 부여받을 수 있는 항목(ID라고도 함)입니다. Google Cloud API는 두 가지 유형의 주 구성원, 즉 사용자 계정서비스 계정을 지원합니다.

  • 사용자 계정Google 계정으로 관리되고 개발자, 관리자 또는 Google Cloud와 상호작용하는 다른 모든 사람을 나타냅니다. 이 계정은 애플리케이션에서 사용자를 대신하여 리소스에 액세스해야 하는 경우를 위한 계정입니다. 자세한 내용은 최종 사용자로 인증을 참조하세요.

  • 서비스 계정IAM에서 관리되며 사람이 아닌 사용자를 나타냅니다. 이 계정은 App Engine 앱 실행 또는 Compute Engine 인스턴스와 상호작용 등 애플리케이션에서 리소스에 액세스하거나 자체적으로 작업을 수행해야 하는 경우를 위한 계정입니다. 자세한 내용은 서비스 계정으로 인증을 참조하세요.

각 계정 유형에 대한 자세한 내용은 IAM 개요를 참조하세요.

애플리케이션

Google Cloud API는 요청 시 사용자 인증 정보를 제시하는 고유하게 식별할 수 있는 애플리케이션인 등록된 애플리케이션의 요청만 수락합니다. 익명 애플리케이션의 요청은 거부됩니다.

애플리케이션 사용자 인증 정보는 Google Cloud API에 대해 요청을 실행하는 호출자에 대한 필수 정보를 제공합니다. 유효한 사용자 인증 정보 유형에는 API 키, OAuth 2.0 클라이언트 사용자 인증 정보 또는 서비스 계정 키가 있습니다. 서비스 계정은 고유하므로 애플리케이션 사용자 인증 정보 또는 주 구성원 ID로 사용할 수 있습니다. 자세한 내용은 서비스 계정 이해를 참조하세요.

Google Cloud API에 대한 요청에 애플리케이션 사용자 인증 정보를 제시하면 호출자가 등록된 애플리케이션으로만 식별됩니다. 인증이 필요한 경우 클라이언트는 사용자 계정 또는 서비스 계정과 같이 애플리케이션을 실행하는 주 구성원도 식별해야 합니다. 다음 섹션에서 이 절차를 설명합니다.

인증 전략

Google Cloud API에서는 OAuth 2.0 프로토콜을 사용하여 사용자 계정과 서비스 계정을 모두 인증합니다. OAuth 2.0 인증 프로세스에서는 주 구성원과 애플리케이션을 모두 확인합니다.

또한 대부분의 Google Cloud API에서는 API 키를 사용하여 공개 데이터에 익명으로 액세스할 수 있습니다. 그러나 API 키에서는 주 구성원이 아닌 애플리케이션만 식별합니다. API 키를 사용할 때는 다른 방법으로 주 구성원을 인증해야 합니다.

Google Cloud API는 서로 다른 런타임 환경에서 다양한 인증 흐름을 지원합니다. 최상의 개발자 환경을 위해 Google Cloud API에 Google Cloud 클라이언트 라이브러리를 사용하는 것이 좋습니다. Google Cloud API는 다양한 인증 흐름과 런타임 환경을 지원하는 Google에서 제공하는 인증 라이브러리를 사용합니다.

Google Cloud API를 사용하여 애플리케이션을 빌드하는 일반적인 단계는 다음과 같습니다.

  • 제공된 Google Cloud 클라이언트 라이브러리 선택 및 사용
  • 애플리케이션에 올바른 인증 흐름 결정
  • 애플리케이션에 필요한 애플리케이션 사용자 인증 정보 찾기 또는 만들기
  • 애플리케이션 시작 시 가능한 한 애플리케이션 기본 사용자 인증 정보(ADC)를 통해 애플리케이션 사용자 인증 정보를 클라이언트 라이브러리에 전달

애플리케이션 요구사항과 실행 위치에 따라 애플리케이션 사용자 인증 정보를 선택해야 합니다. 다음 표에는 공통적인 요구사항에 대한 몇 가지 일반 권장사항이 나와 있습니다.

요구사항 권장사항 설명
공개 데이터에 익명으로 액세스 API 키 API 키는 애플리케이션만 식별하며 사용자 인증을 요구하지 않습니다. 공개 데이터에 액세스할 수 있습니다.
최종 사용자를 대신하여 비공개 데이터에 액세스 OAuth 2.0 클라이언트 OAuth 2.0 클라이언트는 애플리케이션을 식별하고 최종 사용자가 Google을 통해 애플리케이션을 인증할 수 있도록 해줍니다. 최종 사용자를 대신하여 애플리케이션에서 Google Cloud API에 액세스할 수 있습니다.
Google Cloud 환경 내에서 서비스 계정을 대신하여 비공개 데이터에 액세스 환경에서 제공되는 서비스 계정 애플리케이션이 Compute Engine, App Engine, GKE, Cloud Run, Cloud Functions와 같은 Google Cloud 환경 내에서 실행되는 경우 애플리케이션은 환경에서 제공되는 서비스 계정을 사용해야 합니다.

Google Cloud 클라이언트 라이브러리는 서비스 계정 사용자 인증 정보를 자동으로 찾아 사용합니다.
Google Cloud 환경 밖에서 서비스 계정을 대신하여 비공개 데이터에 액세스 서비스 계정 키 서비스 계정을 만들고 비공개 키를 JSON 파일로 다운로드해야 합니다. 런타임 시 서비스 계정 사용자 인증 정보를 생성할 수 있도록 파일을 Google Cloud 클라이언트 라이브러리에 전달해야 합니다.

Google Cloud 클라이언트 라이브러리는 GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 사용하여 서비스 계정 사용자 인증 정보를 자동으로 찾아 사용합니다.

예시

다음 코드 예시는 Pub/Sub 클라이언트 라이브러리의 Go 언어 버전을 통해 다양한 인증 전략을 사용하는 방법을 보여줍니다. 다른 언어의 개발자 환경도 이와 유사합니다.

서비스 계정 키

import (
	"context"
	"fmt"

	"cloud.google.com/go/pubsub"
)

// serviceAccount shows how to use a service account to authenticate.
func serviceAccount() error {
	// Download service account key per https://cloud.google.com/docs/authentication/production.
	// Set environment variable GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json
	// This environment variable will be automatically picked up by the client.
	client, err := pubsub.NewClient(context.Background(), "your-project-id")
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %v", err)
	}
	// Use the authenticated client.
	_ = client

	return nil
}
자세한 내용은 서비스 계정으로 인증을 참조하세요.

환경 서비스 계정

import (
	"context"
	"fmt"

	"cloud.google.com/go/pubsub"
)

// envServiceAccount shows how to use an environment-provided service account to authenticate.
func envServiceAccount() error {
	// If your application runs in a GCP environment, such as Compute Engine,
	// you don't need to provide any application credentials. The client
	// library will find the credentials by itself.
	client, err := pubsub.NewClient(context.Background(), "your-project-id")
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %v", err)
	}
	// Use the authenticated client.
	_ = client

	return nil
}
자세한 내용은 서비스 계정으로 인증을 참조하세요.

OAuth 2.0 클라이언트

import (
	"context"
	"fmt"
	"os"

	"cloud.google.com/go/pubsub"
	"golang.org/x/oauth2"
	"golang.org/x/oauth2/google"
	"google.golang.org/api/option"
)

// oauthClient shows how to use an OAuth client ID to authenticate as an end-user.
func oauthClient() error {
	ctx := context.Background()

	// Please make sure the redirect URL is the same as the one you specified when you
	// created the client ID.
	redirectURL := os.Getenv("OAUTH2_CALLBACK")
	if redirectURL == "" {
		redirectURL = "your redirect url"
	}
	config := &oauth2.Config{
		ClientID:     "your-client-id",
		ClientSecret: "your-client-secret",
		RedirectURL:  redirectURL,
		Scopes:       []string{"email", "profile"},
		Endpoint:     google.Endpoint,
	}

	// Dummy authorization flow to read auth code from stdin.
	authURL := config.AuthCodeURL("your state")
	fmt.Printf("Follow the link in your browser to obtain auth code: %s", authURL)

	// Read the authentication code from the command line
	var code string
	fmt.Scanln(&code)

	// Exchange auth code for OAuth token.
	token, err := config.Exchange(ctx, code)
	if err != nil {
		return fmt.Errorf("config.Exchange: %v", err)
	}
	client, err := pubsub.NewClient(ctx, "your-project-id", option.WithTokenSource(config.TokenSource(ctx, token)))

	// Use the authenticated client.
	_ = client

	return nil
}
자세한 내용은 최종 사용자로 인증을 참조하세요.

API 키

import (
	"context"
	"fmt"

	"cloud.google.com/go/pubsub"
	"google.golang.org/api/option"
)

// apiKey shows how to use an API key to authenticate.
func apiKey() error {
	client, err := pubsub.NewClient(context.Background(), "your-project-id", option.WithAPIKey("api-key-string"))
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %v", err)
	}
	// Use the authenticated client.
	_ = client

	return nil
}
자세한 내용은 API 키 사용을 참조하세요.

다음 단계