서비스 계정 키 생성 및 관리

이 페이지에서는 Google Cloud Console, gcloud 명령줄 도구 또는 Cloud Identity and Access Management API를 사용하거나 Google Cloud 클라이언트 라이브러리 중 하나를 사용하여 서비스 계정 키를 만들고 관리하는 방법을 설명합니다.

이 가이드의 기본 요건

필수 권한

사용자가 서비스 계정 키를 관리할 수 있도록 서비스 계정 키 관리자 역할(roles/iam.serviceAccountKeyAdmin)을 부여합니다. Cloud IAM 기본 역할에도 서비스 계정 키를 관리할 수 있는 권한이 포함되어 있지만 다른 Google Cloud 리소스에 대한 불필요한 액세스를 방지하기 위해 대신 이 역할을 부여하는 것이 좋습니다.

자세한 내용은 서비스 계정 역할 목록을 참조하세요.

서비스 계정 키 만들기

다른 플랫폼이나 온프레미스와 같이 Google Cloud 외부에서 서비스 계정을 사용하려면 먼저 서비스 계정의 ID를 설정해야 합니다. 공개 키/비공개 키 쌍을 통해 안전하게 제공할 수 있습니다.

Cloud Console, gcloud 도구 또는 serviceAccounts.keys.create() 메서드를 사용하거나 클라이언트 라이브러리 중 하나를 사용하여 서비스 계정 키를 만들 수 있습니다.

아래 예시에서 [SA-NAME]은 서비스 계정 이름을, [PROJECT-ID]는 Google Cloud 프로젝트의 ID를 나타냅니다. Cloud Console의 서비스 계정 페이지에서 [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com 문자열을 가져올 수 있습니다.

콘솔

  1. Cloud Console에서 IAM 및 관리자 페이지를 엽니다.

    IAM 및 관리자 페이지 열기

  2. 프로젝트 선택을 클릭하고 프로젝트를 선택한 후 열기를 클릭합니다.

  3. 왼쪽 탐색 메뉴에서 서비스 계정을 클릭합니다.

  4. 키를 만들 서비스 계정의 행을 찾습니다. 이 행에서 을 클릭한 다음 키 만들기를 클릭합니다.

  5. 키 유형을 선택하고 만들기를 클릭합니다.

gcloud 명령어

gcloud iam service-accounts keys create 명령어를 실행하여 서비스 계정 키를 만듭니다.

명령어:

    gcloud iam service-accounts keys create ~/key.json \
      --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    

출력:

created key [e44da1202f82f8f4bdd9d92bc412d1d8a837fa83] of type [json] as
    [/usr/home/username/key.json] for
    [SA-NAME@PROJECT-ID.iam.gserviceaccount.com]
    

REST API

요청:

    POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys
    

응답:

{
        "name":"projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
        "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
        "privateKeyData":"MIIJqAIB . . .",
        "validBeforeTime": "2028-05-08T21:00:00Z",
        "validAfterTime": "2016-01-25T18:38:09.000Z",
        "keyAlgorithm": "KEY_ALG_RSA_2048"
    }
    

C#

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 C# 설정 안내를 따르세요. 자세한 내용은 Cloud IAM C# API 참조 문서를 확인하세요.


    using System;
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.Iam.v1;
    using Google.Apis.Iam.v1.Data;

    public partial class ServiceAccountKeys
    {
        public static ServiceAccountKey CreateKey(string serviceAccountEmail)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(IamService.Scope.CloudPlatform);
            var service = new IamService(new IamService.Initializer
            {
                HttpClientInitializer = credential
            });

            var key = service.Projects.ServiceAccounts.Keys.Create(
                new CreateServiceAccountKeyRequest(),
                "projects/-/serviceAccounts/" + serviceAccountEmail)
                .Execute();
            Console.WriteLine("Created key: " + key.Name);
            return key;
        }
    }

Go

이 샘플을 시도해 보기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Go API 참조 문서를 참조하세요.

import (
    	"context"
    	"fmt"
    	"io"

    	iam "google.golang.org/api/iam/v1"
    )

    // createKey creates a service account key.
    func createKey(w io.Writer, serviceAccountEmail string) (*iam.ServiceAccountKey, error) {
    	ctx := context.Background()
    	service, err := iam.NewService(ctx)
    	if err != nil {
    		return nil, fmt.Errorf("iam.NewService: %v", err)
    	}

    	resource := "projects/-/serviceAccounts/" + serviceAccountEmail
    	request := &iam.CreateServiceAccountKeyRequest{}
    	key, err := service.Projects.ServiceAccounts.Keys.Create(resource, request).Do()
    	if err != nil {
    		return nil, fmt.Errorf("Projects.ServiceAccounts.Keys.Create: %v", err)
    	}
    	fmt.Fprintf(w, "Created key: %v", key.Name)
    	return key, nil
    }
    

자바

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud IAM 자바 API 참조 문서를 확인하세요.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
    import com.google.api.client.json.jackson2.JacksonFactory;
    import com.google.api.services.iam.v1.Iam;
    import com.google.api.services.iam.v1.IamScopes;
    import com.google.api.services.iam.v1.model.CreateServiceAccountKeyRequest;
    import com.google.api.services.iam.v1.model.ServiceAccountKey;
    import java.io.IOException;
    import java.security.GeneralSecurityException;
    import java.util.Collections;

    public class CreateServiceAccountKey {

      // Creates a key for a service account.
      public static void createKey(String projectId) {
        // String projectId = "my-project-id";

        Iam service = null;
        try {
          service = initService();
        } catch (IOException | GeneralSecurityException e) {
          System.out.println("Unable to initialize service: \n" + e.toString());
          return;
        }

        try {
          ServiceAccountKey key =
              service
                  .projects()
                  .serviceAccounts()
                  .keys()
                  .create(
                      "projects/-/serviceAccounts/your-service-account-name@"
                          + projectId
                          + ".iam.gserviceaccount.com",
                      new CreateServiceAccountKeyRequest())
                  .execute();

          System.out.println("Created key: " + key.getName());
        } catch (IOException e) {
          System.out.println("Unable to create service account key: \n" + e.toString());
        }
      }

      private static Iam initService() throws GeneralSecurityException, IOException {
        // Use the Application Default Credentials strategy for authentication. For more info, see:
        // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
        GoogleCredential credential =
            GoogleCredential.getApplicationDefault()
                .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
        // Initialize the IAM service, which can be used to send requests to the IAM API.
        Iam service =
            new Iam.Builder(
                    GoogleNetHttpTransport.newTrustedTransport(),
                    JacksonFactory.getDefaultInstance(),
                    credential)
                .setApplicationName("service-account-keys")
                .build();
        return service;
      }
    }

Python

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 확인하세요.

import os

    from google.oauth2 import service_account
    import googleapiclient.discovery

    def create_key(service_account_email):
        """Creates a key for a service account."""

        credentials = service_account.Credentials.from_service_account_file(
            filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
            scopes=['https://www.googleapis.com/auth/cloud-platform'])

        service = googleapiclient.discovery.build(
            'iam', 'v1', credentials=credentials)

        key = service.projects().serviceAccounts().keys().create(
            name='projects/-/serviceAccounts/' + service_account_email, body={}
            ).execute()

        print('Created key: ' + key['name'])

반환되는 privateKeyData는 base64로 인코딩된 TYPE_GOOGLE_CREDENTIALS_FILE 값(JSON 또는 P12 키/사용자 인증 정보)의 문자열 표현입니다.

키를 만들면 새 공개 키/비공개 키 쌍이 생성되어 머신에 다운로드됩니다. 이 키는 유일한 비공개 키 사본입니다. 비공개 키를 안전하게 보관할 책임은 사용자에게 있습니다. 파일 위치를 잘 기록해 두고 애플리케이션에서 액세스할 수 있도록 조치하세요. 인증된 API 호출을 수행하려면 이 키가 필요합니다.

새롭게 만든 키를 인증에 사용하려면 최대 60초까지 기다려야 할 수도 있습니다. 새로운 키를 만든 직후에 인증 문제가 발생할 경우에는 다시 시도하기 전에 60초가 지났는지 확인하세요.

키 형식은 생성 방법에 따라 다를 수 있습니다. Cloud Console 또는 gcloud 명령줄 도구를 사용하여 생성된 키는 다음과 같습니다.

{
    "type": "service_account",
    "project_id": "[PROJECT-ID]",
    "private_key_id": "[KEY-ID]",
    "private_key": "-----BEGIN PRIVATE KEY-----\n[PRIVATE-KEY]\n-----END PRIVATE KEY-----\n",
    "client_email": "[SERVICE-ACCOUNT-EMAIL]",
    "client_id": "[CLIENT-ID]",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/[SERVICE-ACCOUNT-EMAIL]"
    }
    

반면 REST API 또는 클라이언트 라이브러리에서 생성된 키는 다음과 같습니다.

{
    "name": "projects/[PROJECT-ID]/serviceAccounts/[SERVICE-ACCOUNT-EMAIL]/keys/[KEY-ID]",
    "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
    "privateKeyData": "[PRIVATE-KEY]",
    "validAfterTime": "[DATE]",
    "validBeforeTime": "[DATE]",
    "keyAlgorithm": "KEY_ALG_RSA_2048"
    }
    

반환되는 privateKeyData는 base64로 인코딩된 TYPE_GOOGLE_CREDENTIALS_FILE 값(JSON 또는 P12 키/사용자 인증 정보)의 문자열 표현입니다.

각 방법마다 형식이 다르기 때문에 앞으로 API를 호출할 때는 동일한 방법으로 키를 생성하는 것이 가장 쉽습니다. 예를 들어 gcloud를 사용하는 경우 gcloud를 사용하여 키를 생성합니다. 키를 생성한 방법과 다르게 사용하려면(REST에서 생성된 키를 gcloud로 사용하는 등) 올바른 형식에 맞춰 키를 수정해야 합니다.

누구나 모든 서비스 계정의 모든 공개 키에 공개적으로 액세스할 수 있으며, 비공개 키로 생성한 서명을 검증하는 데 이러한 공개 키를 사용할 수 있습니다. 다음 URL에서 공개 키에 공개적으로 액세스할 수 있습니다.

  • x.509 인증서: https://www.googleapis.com/service_accounts/v1/metadata/x509/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
  • JSON 웹 키(JWK): https://www.googleapis.com/service_accounts/v1/jwk/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
  • 원시 엔드포인트: https://www.googleapis.com/service_accounts/v1/metadata/raw/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

서비스 계정 키 나열

Cloud Console, gcloud 도구 또는 serviceAccount.keys.list() 메서드를 사용하거나 클라이언트 라이브러리 중 하나를 사용하여 서비스 계정의 서비스 계정 키를 나열할 수 있습니다.

serviceAccount.keys.list() 메서드는 일반적으로 서비스 계정과 키를 감사하거나 서비스 계정을 관리하는 커스텀 도구를 빌드하는 데 사용됩니다.

키가 속한 프로젝트를 찾으려면 키를 JSON 파일로 다운로드하고 이 파일을 조사하면 됩니다.

직접 만들지 않은 키가 나열될 수 있습니다. App Engine 및 Compute Engine과 같은 Google Cloud 서비스에서 사용되는 Google Cloud 관리형 키입니다. 사용자 관리형 키와 Google Cloud 관리형 키의 차이점에 대한 자세한 내용은 서비스 계정 이해를 참조하세요.

콘솔

  1. Cloud Console에서 IAM 및 관리자 페이지를 엽니다.

    IAM 및 관리자 페이지 열기

  2. 프로젝트 선택을 클릭하고 프로젝트를 선택한 후 열기를 클릭합니다.

  3. 왼쪽 탐색 메뉴에서 서비스 계정을 클릭합니다. 모든 서비스 계정과 해당 키가 나열됩니다.

gcloud 명령

gcloud iam service-accounts keys list 명령어를 실행하여 서비스 계정 키를 나열합니다.

명령어:

    gcloud iam service-accounts keys list \
      --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    

출력:

KEY_ID CREATED_AT EXPIRES_AT
8e6e3936d7024646f8ceb39792006c07f4a9760c 2016-01-26T21:01:42.000Z 2026-01-23T21:01:42.000Z
937c98f870f5c8db970af527aa3c12fd88b1c20a 2016-01-26T20:55:40.000Z 2026-01-23T20:55:40.000Z

REST API

serviceAccount.keys.list()를 호출하여 서비스 계정 키를 나열합니다.

요청:

    GET https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys
    

응답:

{
        "keys": [
        {
            "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
            "validAfterTime": "2016-01-25T18:38:09.000Z",
            "validBeforeTime": "2026-01-22T18:38:09.000Z",
            "keyAlgorithm": "KEY_ALG_RSA_2048"
        },
        {
            "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/e5e3800831ac1adc8a5849da7d827b4724b1fce8",
            "validAfterTime": "2016-01-25T13:43:27.000Z",
            "validBeforeTime": "2016-01-26T13:43:27.000Z",
            "keyAlgorithm": "KEY_ALG_RSA_2048"
        },
        {
            "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/b97699f042b8eee6a846f4f96259fbcd13e2682e",
            "validAfterTime": "2016-01-26T13:28:27.000Z",
            "validBeforeTime": "2016-01-27T13:28:27.000Z",
            "keyAlgorithm": "KEY_ALG_RSA_2048"
        }
      ]
    }
    

C#

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 C# 설정 안내를 따르세요. 자세한 내용은 Cloud IAM C# API 참조 문서를 확인하세요.


    using System;
    using System.Collections.Generic;
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.Iam.v1;
    using Google.Apis.Iam.v1.Data;

    public partial class ServiceAccountKeys
    {
        public static IList<ServiceAccountKey> ListKeys(string serviceAccountEmail)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(IamService.Scope.CloudPlatform);
            var service = new IamService(new IamService.Initializer
            {
                HttpClientInitializer = credential
            });

            var response = service.Projects.ServiceAccounts.Keys
                .List($"projects/-/serviceAccounts/{serviceAccountEmail}")
                .Execute();
            foreach (ServiceAccountKey key in response.Keys)
            {
                Console.WriteLine("Key: " + key.Name);
            }
            return response.Keys;
        }
    }

Go

이 샘플을 시도해 보기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Go API 참조 문서를 참조하세요.

import (
    	"context"
    	"fmt"
    	"io"

    	iam "google.golang.org/api/iam/v1"
    )

    // listKey lists a service account's keys.
    func listKeys(w io.Writer, serviceAccountEmail string) ([]*iam.ServiceAccountKey, error) {
    	ctx := context.Background()
    	service, err := iam.NewService(ctx)
    	if err != nil {
    		return nil, fmt.Errorf("iam.NewService: %v", err)
    	}

    	resource := "projects/-/serviceAccounts/" + serviceAccountEmail
    	response, err := service.Projects.ServiceAccounts.Keys.List(resource).Do()
    	if err != nil {
    		return nil, fmt.Errorf("Projects.ServiceAccounts.Keys.List: %v", err)
    	}
    	for _, key := range response.Keys {
    		fmt.Fprintf(w, "Listing key: %v", key.Name)
    	}
    	return response.Keys, nil
    }
    

자바

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud IAM 자바 API 참조 문서를 확인하세요.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
    import com.google.api.client.json.jackson2.JacksonFactory;
    import com.google.api.services.iam.v1.Iam;
    import com.google.api.services.iam.v1.IamScopes;
    import com.google.api.services.iam.v1.model.ServiceAccountKey;
    import java.io.IOException;
    import java.security.GeneralSecurityException;
    import java.util.Collections;
    import java.util.List;

    public class ListServiceAccountKeys {

      // Lists all keys for a service account.
      public static void listKeys(String projectId) {
        // String projectId = "my-project-id";

        Iam service = null;
        try {
          service = initService();
        } catch (IOException | GeneralSecurityException e) {
          System.out.println("Unable to initialize service: \n" + e.toString());
          return;
        }

        try {
          List<ServiceAccountKey> keys =
              service
                  .projects()
                  .serviceAccounts()
                  .keys()
                  .list(
                      "projects/-/serviceAccounts/"
                          + "your-service-account-name@"
                          + projectId
                          + ".iam.gserviceaccount.com")
                  .execute()
                  .getKeys();

          for (ServiceAccountKey key : keys) {
            System.out.println("Key: " + key.getName());
          }
        } catch (IOException e) {
          System.out.println("Unable to list service account keys: \n" + e.toString());
        }
      }

      private static Iam initService() throws GeneralSecurityException, IOException {
        // Use the Application Default Credentials strategy for authentication. For more info, see:
        // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
        GoogleCredential credential =
            GoogleCredential.getApplicationDefault()
                .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
        // Initialize the IAM service, which can be used to send requests to the IAM API.
        Iam service =
            new Iam.Builder(
                    GoogleNetHttpTransport.newTrustedTransport(),
                    JacksonFactory.getDefaultInstance(),
                    credential)
                .setApplicationName("service-account-keys")
                .build();
        return service;
      }
    }

Python

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 확인하세요.

import os

    from google.oauth2 import service_account
    import googleapiclient.discovery

    def list_keys(service_account_email):
        """Lists all keys for a service account."""

        credentials = service_account.Credentials.from_service_account_file(
            filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
            scopes=['https://www.googleapis.com/auth/cloud-platform'])

        service = googleapiclient.discovery.build(
            'iam', 'v1', credentials=credentials)

        keys = service.projects().serviceAccounts().keys().list(
            name='projects/-/serviceAccounts/' + service_account_email).execute()

        for key in keys['keys']:
            print('Key: ' + key['name'])

서비스 계정 키 받기

키를 처음 만들면 서비스 계정 키에 대한 비공개 키 데이터만 가져올 수 있습니다.

projects.serviceAccounts.keys.get() REST API 메서드를 사용하여 ID, 알고리즘, 공개 키 데이터 등 키 기본 정보를 가져올 수 있습니다. Cloud Console 또는 gcloud 명령줄 도구를 사용할 수 없습니다.

서비스 계정의 공개 키 업로드

사용자 관리 키 쌍의 공개 키 부분을 서비스 계정에 업로드할 수 있습니다. 업로드한 공개 키는 서비스 계정과 영구적으로 연결되며 다른 사용자 관리 서비스 계정 키와 동일한 방식으로 사용됩니다.

Google 관리형 키 쌍 대신 사용자 관리형 키 쌍을 사용할 경우 키 쌍을 유지관리하고 정기적으로 순환해야 합니다.

공개 키를 업로드하기 전에 공개 키가 RSA_X509_PEM 형식인지 확인합니다. 기존 인증서가 없는 경우 openssl과 같은 도구를 사용하여 자체 서명된 X.509를 적절한 형식으로 생성할 수 있습니다. openssl 도구를 사용하여 유효한 인증서를 생성하려면 다음을 실행하세요.

openssl req -x509 -nodes -newkey rsa:2048 -keyout /output/path/to/private/key \
        -out /output/path/to/public/key -subj "/CN=unused"
    

openssl을 사용하여 생성된 X.509 인증서는 기본적으로 30일 후에 만료됩니다. 그러나 -n 플래그를 사용하면 만료 시간을 연장하거나 단축할 수 있습니다.

gcloud 명령

gcloud alpha iam service-accounts keys upload 명령어를 실행하여 서비스 계정 키 서명용 공개 키를 업로드합니다.

명령어:

    gcloud alpha iam service-accounts keys upload /path/to/public/key \
      --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    

출력에는 업로드된 키의 고유 식별자가 포함됩니다.

Name: projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0
    

명령어가 성공했는지 확인하려면 gcloud iam service-accounts keys list 명령어를 실행합니다.

    gcloud iam service-accounts keys list \
      --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    

출력에는 키가 생성된 후에 반환된 식별자와 동일한 고유 식별자가 포함됩니다.

KEY_ID CREATED_AT EXPIRES_AT
c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0 2019-06-26T21:01:42.000Z 2029-06-23T21:01:42.000Z

REST API

serviceAccount.keys.upload()를 호출하여 서비스 계정의 공개 키를 업로드합니다.

요청:

    POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys:upload
    

요청 본문:

{
      "publicKeyData": "LS0tLS1CRUdJTiBDRVJUSUZJQ...jlsCjVjMXUzVlVqS3AtLS0tXG4="
    }
    

요청 본문에는 공개 키 데이터가 RSA_X509_PEM 형식으로 포함되어야 합니다.

응답:

{
      "name": "projects/[PROJECT-ID]/serviceAccounts/[SERVICE-ACCOUNT-EMAIL]/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "USER_PROVIDED",
    }
    

서비스 계정 키 삭제

Cloud Console, gcloud 도구 또는 serviceAccount.keys.delete() 메서드를 사용하거나 클라이언트 라이브러리 중 하나를 사용하여 서비스 계정 키를 삭제할 수 있습니다.

키를 삭제하면 애플리케이션에서 더 이상 이 키를 사용하여 Cloud Platform 리소스에 액세스할 수 없습니다. 보안을 위해 서비스 계정 키를 정기적으로 순환하는 방법이 권장됩니다. 키를 순환하려면 새 키를 만들고 애플리케이션에서 새 키를 사용하도록 전환한 후 이전 키를 삭제하면 됩니다. serviceAccount.keys.create() 메서드와 serviceAccount.keys.delete() 메서드를 함께 사용하면 자동으로 순환합니다.

콘솔

  1. Cloud Console에서 IAM 및 관리자 페이지를 엽니다.

    IAM 및 관리자 페이지 열기

  2. 프로젝트 선택을 클릭하고 프로젝트를 선택한 후 열기를 클릭합니다.

  3. 왼쪽 탐색 메뉴에서 서비스 계정을 클릭합니다. 모든 서비스 계정과 해당 키가 나열됩니다.

  4. 키를 만들 서비스 계정의 행을 찾습니다. 이 행에서 을 클릭한 다음 키 만들기를 클릭합니다.

  5. 키 목록에서 삭제할 키마다 삭제 를 클릭합니다.

gcloud 명령

gcloud iam service-accounts keys delete 명령어를 실행하여 서비스 계정 키를 삭제합니다.

명령어:

    gcloud iam service-accounts keys delete [KEY-ID] \
      --iam-account [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    

출력:

Deleted key [8e6e3936d7024646f8ceb39792006c07f4a9760c] for
    service account [SA-NAME@PROJECT-ID.iam.gserviceaccount.com]
    

REST API

요청:

    DELETE https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys/[KEY-ID]
    

C#

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 C# 설정 안내를 따르세요. 자세한 내용은 Cloud IAM C# API 참조 문서를 확인하세요.


    using System;
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.Iam.v1;
    using Google.Apis.Iam.v1.Data;

    public partial class ServiceAccountKeys
    {
        public static void DeleteKey(string fullKeyName)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(IamService.Scope.CloudPlatform);
            var service = new IamService(new IamService.Initializer
            {
                HttpClientInitializer = credential
            });

            service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Execute();
            Console.WriteLine("Deleted key: " + fullKeyName);
        }
    }

Go

이 샘플을 시도해 보기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Go API 참조 문서를 참조하세요.

import (
    	"context"
    	"fmt"
    	"io"

    	iam "google.golang.org/api/iam/v1"
    )

    // deleteKey deletes a service account key.
    func deleteKey(w io.Writer, fullKeyName string) error {
    	ctx := context.Background()
    	service, err := iam.NewService(ctx)
    	if err != nil {
    		return fmt.Errorf("iam.NewService: %v", err)
    	}

    	_, err = service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Do()
    	if err != nil {
    		return fmt.Errorf("Projects.ServiceAccounts.Keys.Delete: %v", err)
    	}
    	fmt.Fprintf(w, "Deleted key: %v", fullKeyName)
    	return nil
    }
    

자바

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud IAM 자바 API 참조 문서를 확인하세요.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
    import com.google.api.client.json.jackson2.JacksonFactory;
    import com.google.api.services.iam.v1.Iam;
    import com.google.api.services.iam.v1.IamScopes;
    import com.google.api.services.iam.v1.model.ServiceAccountKey;
    import java.io.IOException;
    import java.security.GeneralSecurityException;
    import java.util.Collections;
    import java.util.List;

    public class DeleteServiceAccountKey {

      // Deletes a service account key.
      public static void deleteKey(String projectId) {
        // String projectId = "my-project-id";

        Iam service = null;
        try {
          service = initService();
        } catch (IOException | GeneralSecurityException e) {
          System.out.println("Unable to initialize service: \n" + e.toString());
          return;
        }

        try {
          // First, get the name of the key using List() or Get()
          List<ServiceAccountKey> keys =
              service
                  .projects()
                  .serviceAccounts()
                  .keys()
                  .list(
                      "projects/-/serviceAccounts/"
                          + "your-service-account-name@"
                          + projectId
                          + ".iam.gserviceaccount.com")
                  .execute()
                  .getKeys();
          String keyToDelete = keys.get(0).getName();

          // Then you can delete the key
          service.projects().serviceAccounts().keys().delete(keyToDelete).execute();

          System.out.println("Deleted key: " + keyToDelete);
        } catch (IOException e) {
          System.out.println("Unable to delete service account key: \n" + e.toString());
        }
      }

      private static Iam initService() throws GeneralSecurityException, IOException {
        // Use the Application Default Credentials strategy for authentication. For more info, see:
        // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
        GoogleCredential credential =
            GoogleCredential.getApplicationDefault()
                .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
        // Initialize the IAM service, which can be used to send requests to the IAM API.
        Iam service =
            new Iam.Builder(
                    GoogleNetHttpTransport.newTrustedTransport(),
                    JacksonFactory.getDefaultInstance(),
                    credential)
                .setApplicationName("service-account-keys")
                .build();
        return service;
      }
    }

Python

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 확인하세요.

import os

    from google.oauth2 import service_account
    import googleapiclient.discovery

    def delete_key(full_key_name):
        """Deletes a service account key."""

        credentials = service_account.Credentials.from_service_account_file(
            filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
            scopes=['https://www.googleapis.com/auth/cloud-platform'])

        service = googleapiclient.discovery.build(
            'iam', 'v1', credentials=credentials)

        service.projects().serviceAccounts().keys().delete(
            name=full_key_name).execute()

        print('Deleted key: ' + full_key_name)