액세스제어 목록(ACL) 만들기 및 관리

이 페이지에서는 액세스제어 목록(ACL)을 사용하여 버킷 및 객체에 액세스를 제어하는 방법을 설명합니다. ACL은 버킷 및 객체에 액세스할 수 있는 사람 그리고 이들에게 제공되는 액세스 권한 수준을 정의하는 데 사용할 수 있는 메커니즘입니다. ACL에 대해 자세히 알아보려면 ACL 개요를 읽어보세요.

버킷 및 객체의 액세스를 제어하는 다른 방법을 알아보려면 액세스 제어 개요를 읽어보세요.

시작하기 전에

ACL을 사용해야 할까요?

대부분의 경우 Cloud Identity and Access Management(Cloud IAM)를 사용하여 리소스에 대한 액세스를 제어하는 것이 좋습니다. IAM은 모든 Google Cloud Platform에서 엔터프라이즈급 액세스 제어를 제공하며 프로젝트 같은 상위 리소스에 부여된 권한을 버킷, 객체 등 하위 리소스에 상속하는 것을 허용하기 때문입니다. Cloud Storage에서 Cloud IAM을 사용하는 방법에 대한 지침은 Cloud IAM 권한 사용을 참조하세요.

Cloud IAM 권한은 버킷 내의 모든 객체에 적용되므로 버킷 내의 개별 객체에 대한 액세스 권한을 맞춤설정해야 하는 경우에는 ACL을 사용하는 것이 좋습니다. 하지만 버킷 내 모든 객체에 공통적인 액세스에 대해서는 여전히 Cloud IAM을 사용해야 합니다. 그래야 수행해야 하는 세부 관리의 양이 줄어들기 때문입니다.

ACL을 설정해야 할까요?

버킷 또는 객체에 지정할 권한에 따라 ACL을 설정할 필요가 없을 수 있습니다. 버킷 또는 객체에 지정할 권한을 이미 포함하고 있을 수 있는 기본 ACL로 버킷 및 객체가 생성됩니다.

다음의 안내를 따라 ACL을 설정해야 하는지를 결정하십시오.

버킷:

콘솔

새 버킷은 사전 정의된 project-private ACL로 생성됩니다. 버킷에 다른 권한이 필요한 경우에는 ACL을 설정합니다.

gsutil

새 버킷은 project-private으로 추가됩니다. 버킷에 다른 권한이 필요한 경우에는 ACL을 설정하세요.

JSON API

기본적으로 새 버킷은 project-private으로 추가됩니다. 버킷에 다른 권한이 필요한 경우에는 ACL을 설정하세요.

XML API

새 버킷은 project-private으로 추가됩니다. 버킷에 다른 권한이 필요한 경우에는 ACL을 설정하세요.

위에서 언급한 대로 모든 버킷에는 기본 객체 ACL이 있습니다. 기본 객체 ACL은 사전 정의된 ACL 또는 (JSON API를 사용 중인 경우) 요청에 지정된 ACL이 없는 버킷에 업로드된 모든 객체에 적용됩니다. 기본 객체 ACL에서 자세히 읽어보세요.

객체:

콘솔

업로드된 객체는 버킷 객체와 같은 ACL을 얻고, 업로더는 ACL에 소유자로 추가됩니다. 객체에 다른 권한이 필요한 경우에는 ACL을 설정하세요.

gsutil

새 객체는 버킷에 대한 기본 객체 ACL과 함께 추가됩니다. 클라우드에 이미 저장된 객체를 복사할 때는 -p 옵션으로 이 동작을 재정의할 수 있습니다.

JSON API

기본적으로 새 객체는 버킷에 대한 기본 객체 ACL과 함께 추가됩니다.

XML API

새 객체는 버킷에 대한 기본 객체 ACL과 함께 추가됩니다.

어떤 인터페이스를 사용해야 할까요?

아래의 예는 Google Cloud Platform Console, gsutil 명령줄 도구, Cloud Storage 클라이언트 라이브러리, XML, JSON API를 사용하여 액세스 제어를 구성하는 방법을 보여줍니다. 이 가이드라인을 따라 사용할 방법을 선택하세요.

  • 액세스 제어를 처음 사용하고 개별 객체에 대해서만 ACL을 수정하려는 경우에는 GCP Console을 사용하세요.

  • 액세스 제어를 처음 사용하고 버킷 및 객체에 대해 ACL을 수정하려는 경우에는 gsutil을 사용하세요.

  • 사용해 본 경험이 있으면 Cloud Storage 클라이언트 라이브러리 중 하나를 사용하여 ACL을 관리하세요.

  • API를 사용하여 ACL을 지정하는 경우에는 과거에 HTTP 요청을 보낸 경험이 있을 것입니다. 선호하는 도구나 애플리케이션을 사용하여 HTTP 요청을 보낼 수 있습니다. 아래 예에서는 cURL 도구를 사용합니다. cURL 예에서 사용할 승인 토큰은 OAuth 2.0 플레이그라운드에서 얻을 수 있습니다.

ACL 설정

ACL을 설정하고 얻는 데 사용하는 도구나 API에 따라 사용하는 ACL 구문이 결정됩니다. ACL 구문은 서로 다르게 보이지만 같은 ACL 정보를 포함하고 있습니다. 바로 범위권한을 부여하는 항목입니다.

콘솔

  1. GCP Console에서 Cloud Storage 브라우저로 이동합니다.
    Cloud Storage 브라우저로 이동

  2. ACL을 수정할 객체로 이동합니다.

  3. 객체의 드롭다운 메뉴에서 권한 수정을 선택합니다.

    다음과 같은 권한 대화 상자가 나타납니다.

    이 스크린샷은 다음 4개의 항목이 있는 ACL을 보여줍니다.

    • 첫 번째 항목에서는 특정 프로젝트(프로젝트 번호: 867489140601)의 모든 소유자가 이 객체의 'Owner' 액세스/권한을 받습니다.
    • 두 번째 항목에서는 특정 프로젝트(프로젝트 번호: 867489140601)의 모든 편집자도 이 객체의 'Owner' 액세스/권한을 받습니다.
    • 세 번째 항목에서는 특정 프로젝트(프로젝트 번호 867489140601)의 모든 뷰어가 이 객체에 대해 'Reader' 액세스/권한을 받습니다.
    • 네 번째 항목에서는 객체를 업로드한 사용자가 객체에 대한 'Owner' 액세스/권한을 받습니다. 객체 업로더는 항상 'Owner'로 설정되며 삭제될 수 없습니다.
  4. 항목 추가를 클릭합니다.

  5. 권한을 부여할 항목 유형을 선택합니다.

    항목은 권한을 얻는 당사자 유형을 지정합니다(예: 사용자 또는 그룹). 항목에 지원되는 값 목록은 액세스 제어 범위를 참조하세요.

  6. 이름에 값을 입력합니다.

    이름은 특정 사용자, 그룹 또는 다른 항목 유형을 식별합니다. 이름에 지원되는 값 목록은 액세스 제어 범위를 참조하세요.

    항목이름을 통해 권한이 적용되는 사람을 정의합니다.

  7. 액세스에서 값을 선택합니다.

    액세스는 객체에 설정할 권한을 정의합니다. 액세스에 지원되는 값 목록은 액세스 제어 권한을 참조하세요.

  8. 저장을 클릭합니다.

gsutil

gsutil acl을 사용하여 ACL을 지정합니다.

  • 개별 권한 부여를 지정하려면 다음을 입력합니다.

    gsutil acl ch -u [USER_EMAIL]:[PERMISSION] gs://[BUCKET_NAME]

  • 미리 준비된 ACL을 지정하려면 다음을 입력합니다.

    gsutil acl set [CANNED_ACL_NAME] gs://[BUCKET_NAME]

  • ACL을 JSON 형식으로 지정하려면 다음을 입력합니다.

    gsutil acl set [JSON_FILE] gs://[bucket-name]

    여기서 [JSON_FILE]에는 JSON 형식으로 지정된 ACL이 포함됩니다.

코드 샘플

C++

자세한 내용은 Cloud Storage C++ API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에 추가합니다.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name, std::string entity) {
  StatusOr<gcs::BucketAccessControl> patched_acl =
      client.PatchBucketAcl(bucket_name, entity,
                            gcs::BucketAccessControlPatchBuilder().set_role(
                                gcs::BucketAccessControl::ROLE_OWNER()));

  if (!patched_acl) {
    throw std::runtime_error(patched_acl.status().message());
  }

  std::cout << "ACL entry for " << patched_acl->entity() << " in bucket "
            << patched_acl->bucket() << " is now " << *patched_acl << "\n";
}

다음 샘플은 ACL을 객체에 추가합니다.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name, std::string object_name,
   std::string entity) {
  StatusOr<gcs::ObjectAccessControl> patched_acl =
      client.CreateObjectAcl(bucket_name, object_name, entity,
                             gcs::ObjectAccessControl::ROLE_OWNER());

  if (!patched_acl) {
    throw std::runtime_error(patched_acl.status().message());
  }

  std::cout << "ACL entry for " << patched_acl->entity() << " in object "
            << patched_acl->object() << " in bucket " << patched_acl->bucket()
            << " is now " << *patched_acl << "\n";
}

C#

자세한 내용은 Cloud Storage C# API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에 추가합니다.

private void AddBucketOwner(string bucketName, string userEmail)
{
    var storage = StorageClient.Create();
    var bucket = storage.GetBucket(bucketName, new GetBucketOptions()
    {
        Projection = Projection.Full
    });
    if (null == bucket.Acl)
    {
        bucket.Acl = new List<BucketAccessControl>();
    }
    bucket.Acl.Add(new BucketAccessControl()
    {
        Bucket = bucketName,
        Entity = $"user-{userEmail}",
        Role = "OWNER",
    });
    var updatedBucket = storage.UpdateBucket(bucket, new UpdateBucketOptions()
    {
        // Avoid race conditions.
        IfMetagenerationMatch = bucket.Metageneration,
    });
}

다음 샘플은 ACL을 객체에 추가합니다.

private void AddObjectOwner(string bucketName, string objectName,
    string userEmail)
{
    var storage = StorageClient.Create();
    var storageObject = storage.GetObject(bucketName, objectName,
        new GetObjectOptions() { Projection = Projection.Full });
    if (null == storageObject.Acl)
    {
        storageObject.Acl = new List<ObjectAccessControl>();
    }
    storageObject.Acl.Add(new ObjectAccessControl()
    {
        Bucket = bucketName,
        Entity = $"user-{userEmail}",
        Role = "OWNER",
    });
    var updatedObject = storage.UpdateObject(storageObject, new UpdateObjectOptions()
    {
        // Avoid race conditions.
        IfMetagenerationMatch = storageObject.Metageneration,
    });
}

Go

자세한 내용은 Cloud Storage Go API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에 추가합니다.

func addBucketACL(client *storage.Client, bucket string) error {
	ctx := context.Background()

	acl := client.Bucket(bucket).ACL()
	if err := acl.Set(ctx, storage.AllAuthenticatedUsers, storage.RoleReader); err != nil {
		return err
	}
	return nil
}

다음 샘플은 ACL을 객체에 추가합니다.

func addObjectACL(client *storage.Client, bucket, object string) error {
	ctx := context.Background()

	acl := client.Bucket(bucket).Object(object).ACL()
	if err := acl.Set(ctx, storage.AllAuthenticatedUsers, storage.RoleReader); err != nil {
		return err
	}
	return nil
}

자바

자세한 내용은 Cloud Storage 자바 API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에 추가합니다.

Acl acl = storage.createAcl(bucketName, Acl.of(User.ofAllAuthenticatedUsers(), Role.READER));

다음 샘플은 ACL을 객체에 추가합니다.

BlobId blobId = BlobId.of(bucketName, blobName, blobGeneration);
Acl acl = storage.createAcl(blobId, Acl.of(User.ofAllAuthenticatedUsers(), Role.READER));

Node.js

자세한 내용은 Cloud Storage Node.js API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에 추가합니다.

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const userEmail = 'Email of user to add, e.g. developer@company.com';

// Makes the user an owner of the bucket. You can use addAllUsers(),
// addDomain(), addProject(), addGroup(), and addAllAuthenticatedUsers()
// to grant access to different types of entities. You can also use "readers"
// and "writers" to grant different roles.
await storage.bucket(bucketName).acl.owners.addUser(userEmail);

console.log(`Added user ${userEmail} as an owner on bucket ${bucketName}.`);

다음 샘플은 ACL을 객체에 추가합니다.

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const filename = 'Name of file to access, e.g. file.txt';
// const userEmail = 'Email of user to add, e.g. developer@company.com';

// Makes the user an owner of the file. You can use addAllUsers(),
// addDomain(), addProject(), addGroup(), and addAllAuthenticatedUsers()
// to grant access to different types of entities. You can also use "readers"
// and "writers" to grant different roles.
await storage
  .bucket(bucketName)
  .file(filename)
  .acl.owners.addUser(userEmail);

console.log(`Added user ${userEmail} as an owner on file ${filename}.`);

PHP

자세한 내용은 Cloud Storage PHP API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에 추가합니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Add an entity and role to a bucket's ACL.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 * @param string $entity The entity to update access controls for.
 * @param string $role The permissions to add for the specified entity. May
 *        be one of 'OWNER', 'READER', or 'WRITER'.
 * @param array $options
 *
 * @return void
 */
function add_bucket_acl($bucketName, $entity, $role, $options = [])
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $acl = $bucket->acl();
    $acl->add($entity, $role, $options);
    printf('Added %s (%s) to gs://%s ACL' . PHP_EOL, $entity, $role, $bucketName);
}

다음 샘플은 ACL을 객체에 추가합니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Add an entity and role to an object's ACL.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 * @param string $objectName the name of your Cloud Storage object.
 * @param string $entity The entity to update access controls for.
 * @param string $role The permissions to add for the specified entity. May
 *        be one of 'OWNER', 'READER', or 'WRITER'.
 * @param array $options
 *
 * @return void
 */
function add_object_acl($bucketName, $objectName, $entity, $role, $options = [])
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $object = $bucket->object($objectName);
    $acl = $object->acl();
    $acl->add($entity, $role, $options);
    printf('Added %s (%s) to gs://%s/%s ACL' . PHP_EOL, $entity, $role, $bucketName, $objectName);
}

Python

자세한 내용은 Cloud Storage Python API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에 추가합니다.

def add_bucket_owner(bucket_name, user_email):
    """Adds a user as an owner on the given bucket."""
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    # Reload fetches the current ACL from Cloud Storage.
    bucket.acl.reload()

    # You can also use `group()`, `domain()`, `all_authenticated()` and `all()`
    # to grant access to different types of entities.
    # You can also use `grant_read()` or `grant_write()` to grant different
    # roles.
    bucket.acl.user(user_email).grant_owner()
    bucket.acl.save()

    print('Added user {} as an owner on bucket {}.'.format(
        user_email, bucket_name))

다음 샘플은 ACL을 객체에 추가합니다.

def add_blob_owner(bucket_name, blob_name, user_email):
    """Adds a user as an owner on the given blob."""
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)

    # Reload fetches the current ACL from Cloud Storage.
    blob.acl.reload()

    # You can also use `group`, `domain`, `all_authenticated` and `all` to
    # grant access to different types of entities. You can also use
    # `grant_read` or `grant_write` to grant different roles.
    blob.acl.user(user_email).grant_owner()
    blob.acl.save()

    print('Added user {} as an owner on blob {} in bucket {}.'.format(
        user_email, blob_name, bucket_name))

Ruby

자세한 내용은 Cloud Storage Ruby API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에 추가합니다.

# project_id  = "Your Google Cloud project ID"
# bucket_name = "Your Google Cloud Storage bucket name"
# email       = "Google Cloud Storage ACL Entity email"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new project_id: project_id
bucket  = storage.bucket bucket_name

bucket.acl.add_owner email

puts "Added OWNER permission for #{email} to #{bucket_name}"

다음 샘플은 ACL을 객체에 추가합니다.

# project_id  = "Your Google Cloud project ID"
# bucket_name = "Your Google Cloud Storage bucket name"
# file_name   = "Name of a file in the Storage bucket"
# email       = "Google Cloud Storage ACL Entity email"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new project_id: project_id
bucket  = storage.bucket bucket_name
file    = bucket.file file_name

file.acl.add_owner email

puts "Added OWNER permission for #{email} to #{file_name}"

JSON API

버킷을 생성할 때 insert 요청에 acl[] 속성을 지정할 수 있습니다. 기존 버킷의 경우에는 patch 또는 update 요청에 acl[] 속성을 지정합니다.

객체를 생성할 때는 요청 본문에 acl[] 속성을 지정하거나 insert 요청에 predefinedAcl 쿼리 매개변수를 지정할 수 있습니다. 기존 객체의 경우에는 patch 또는 update 요청에 acl[] 속성이나 predefinedAcl 쿼리 매개변수를 지정합니다.

버킷 및 객체 ACL 속성의 정의는 각각 BucketAccessControls 리소스와 ObjectAccessControls 리소스를 참조하세요.

다음 예에서는 서로 다른 버킷 ACL 항목을 보여줍니다.

"acl": [
{
"kind": "storage#bucketAccessControl",
"id": "example-bucket/project-owners-123412341234",
"selfLink": "https://www.googleapis.com/storage/v1/b/example-bucket/acl/project-owners-123412341234",
"bucket": "example-bucket",
"entity": "project-owners-123412341234",
"role": "OWNER",
"projectTeam": {
       "projectNumber": "123412341234",
       "team": "owners"
},
"etag": "CDk="
},
{
"kind": "storage#bucketAccessControl",
"id": "example-bucket/project-editors-123412341234",
"selfLink": "https://www.googleapis.com/storage/v1/b/example-bucket/acl/project-editors-123412341234",
"bucket": "example-bucket",
"entity": "project-editors-123412341234",
"role": "OWNER",
"projectTeam": {
     "projectNumber": "123412341234",
     "team": "editors"
},
"etag": "CDk="
},
{
"kind": "storage#bucketAccessControl",
"id": "example-bucket/project-viewers-123412341234",
"selfLink": "https://www.googleapis.com/storage/v1/b/example-bucket/acl/project-viewers-123412341234",
"bucket": "example-bucket",
"entity": "project-viewers-123412341234",
"role": "READER",
"projectTeam": {
     "projectNumber": "123412341234",
     "team": "viewers"
},
"etag": "CDk="
},
{
"kind": "storage#bucketAccessControl",
"id": "example-bucket/group-gs-announce@googlegroups.com",
"selfLink": "https://www.googleapis.com/storage/v1/b/example-bucket/acl/group-gs-announce@googlegroups.com",
"bucket": "example-bucket",
"entity": "group-gs-announce@googlegroups.com",
"role": "READER",
"email": "gs-announce@googlegroups.com",
"etag": "CDk="
},
{
"kind": "storage#bucketAccessControl",
"id": "example-bucket/user-jane@gmail.com",
"selfLink": "https://www.googleapis.com/storage/v1/b/example-bucket/acl/user-jane@gmail.com",
"bucket": "example-bucket",
"entity": "user-jane@gmail.com",
"role": "READER",
"email": "jane@gmail.com",
"etag": "CDk="
},
{
"kind": "storage#bucketAccessControl",
"id": "example-bucket/allUsers",
"selfLink": "https://www.googleapis.com/storage/v1/b/example-bucket/acl/allUsers",
"bucket": "example-bucket",
"entity": "allUsers",
"role": "READER",
"etag": "CDk="
},
{
"kind": "storage#bucketAccessControl",
"id": "example-bucket/allAuthenticatedUsers",
"selfLink": "https://www.googleapis.com/storage/v1/b/example-bucket/acl/allAuthenticatedUsers",
"bucket": "example-bucket",
"entity": "allAuthenticatedUsers",
"role": "READER",
"etag": "CDk="
}
]

XML API

XML API에서는 ACL을 XML 형식으로 사용합니다. XML 문서를 요청 본문에 첨부하여 버킷 및 객체 ACL을 변경해야 합니다. 버킷 및 객체 ACL을 얻을 때 XML 문서가 반환됩니다. XML 문서에는 개별 버킷 또는 객체 ACL 항목이 포함되어 있습니다.

  • PUT Bucket 요청으로 버킷을 만든 후에는 두 번째 PUT Bucket 요청을 ?acl 매개변수와 함께 사용하여 버킷 ACL을 변경합니다.

  • PUT Object 요청으로 객체를 업로드한 후에는 ?acl 매개변수 또는 x-googl-acl 요청 헤더를 사용하여 다른 PUT 요청으로 ACL을 변경합니다.

XML API에 다음 ACL 구문을 사용합니다. RELAX NG 컴팩트 구문 형식 스키마에 Google ACL XML의 정확한 형식 요구 사항이 설명되어 있습니다.

요소 설명
AccessControlList EntriesOwner 요소의 컨테이너입니다.
Owner DisplayNameID 요소의 컨테이너입니다. 객체는 항상 업로드한 사용자의 소유이기 때문에 이 요소는 객체에 대해서 필수가 아닙니다. 이 요소는 마이그레이션 시나리오에서 Amazon S3 ACL 구문을 사용 중일 때 사용됩니다.

Amazon Simple Storage Service™ 및 Amazon S3™는 미국 또는 다른 국가에서 사용되는 Amazon.com, Inc. 또는 해당 계열사의 상표입니다.
ID 버킷 소유자의 Google Cloud Storage ID입니다.
DisplayName 현재 구현되어 있지 않습니다. 값은 항상 빈 문자열입니다.
Entries 0개 이상의 Entry 요소를 위한 컨테이너입니다.
Entry ScopePermission 요소의 컨테이너입니다. Entry는 하나의 Scope와 하나의 Permission 요소만 포함해야 합니다.
Scope ACL 범위를 정의하는 ID, EmailAddress, Domain 요소의 컨테이너입니다. 이 요소에는 다음 값 중 하나를 포함하는 type 속성이 있어야 합니다. UserByID, UserByEmail, GroupByID, GroupByEmail, GroupByDomain, AllUsers, AllAuthenticatedUsers.
ID 권한 항목이 ID로 지정될 때 권한을 부여받는 사람의 식별자입니다.
EmailAddress 권한 항목이 이메일로 지정될 때 권한을 부여받는 사람의 이메일 식별자입니다.
Domain 권한 항목이 도메인으로 지정될 때 권한을 부여받는 사람의 도메인 식별자입니다.
Name 지정할 수 있거나 범위가 UserByEmail 또는 GroupByEmail인 경우 자동으로 추가할 수 있는 선택적 요소입니다.
Permission 부여된 권한입니다(READ, WRITE, FULL_CONTROL).

XML API를 사용하여 ACL을 작업할 때 주의 사항:

  • 위에 설명된 XML 형식만 사용할 수 있습니다.
  • 중복된 범위를 설정할 수 없습니다.

    ACL XML에 여러 개의 항목이 있을 수 있지만, 범위가 중복된 항목은 있을 수 없습니다. 예를 들어 jane@example.com의 같은 범위 요소를 사용하는 항목이 2개 있을 수는 없습니다.

다음 예는 서로 다른 버킷 ACL 항목을 보여줍니다.

<?xml version="1.0" encoding="UTF-8"?>
<AccessControlList>
<Owner>
    <ID>00b4903a9721...</ID>
</Owner>
<Entries>
    <Entry>
      <Scope type="GroupById">
        <ID>00b4903a9722...</ID>
      </Scope>
      <Permission>FULL_CONTROL</Permission>
    </Entry>
    <Entry>
      <Scope type="GroupById">
        <ID>00b4903a9723...</ID>
      </Scope>
      <Permission>FULL_CONTROL</Permission>
    </Entry>
    <Entry>
      <Scope type="GroupById">
        <ID>00b4903a9724...</ID>
      </Scope>
      <Permission>READ</Permission>
    </Entry>
    <Entry>
      <Scope type="GroupByDomain">
        <Domain>example.com</Domain>
      </Scope>
      <Permission>READ</Permission>
    </Entry>
    <Entry>
      <Scope type="GroupByEmail">
        <EmailAddress>gs-announce@googlegroups.com</EmailAddress>
      </Scope>
      <Permission>READ</Permission>
    </Entry>
    <Entry>
      <Scope type="UserByEmail">
        <EmailAddress>jane@gmail.com</EmailAddress>
        <Name>jane</Name>
      </Scope>
      <Permission>READ</Permission>
    </Entry>
    <Entry>
      <Scope type="AllUsers"/>
      <Permission>READ</Permission>
    </Entry>
    <Entry>
      <Scope type="AllAuthenticatedUsers"/>
      <Permission>READ</Permission>
    </Entry>
</Entries>
</AccessControlList>

ACL XML에서 Name 요소 설정

버킷이나 객체에서 ACL을 검색할 때 일부 항목에 <Name> 요소가 더 추가된 것을 볼 수 있습니다. 예를 들어 다음과 같은 항목을 볼 수 있습니다.

<Entry>
    <Scope type="UserByEmail">
      <EmailAddress>jane@gmail.com</EmailAddress>
      <Name>Jane</Name>
    </Scope>
    <Permission>FULL_CONTROL</Permission>
</Entry>

이러한 선택적 <Name> 요소는 다음 두 가지 상황에서 채워집니다.

  1. 버킷 또는 객체의 ACL에 <Name>이 요소로 포함된 경우

    ACL을 설정할 때 <Name> 요소를 ACL 항목에 포함하도록 선택할 수 있습니다. <Name> 요소 안에 어떠한 값이라도 제공할 수 있으며, Cloud Storage는 ACL을 삭제하거나 덮어쓰기 전까지 이 값을 기억합니다. 이 방식은 Google Cloud Storage ID와 같이 쉽게 식별할 수 없는 식별자를 사용 중인 경우에 유용합니다.

  2. UserByEmail 또는 GroupByEmail 범위에 공개 Google 프로필이 포함된 경우

    이러한 범위 중 하나를 사용하고 있지만 <Name> 요소를 제공하지 않는 경우, Cloud Storage는 이메일 주소와 연관된 사용자 또는 Google 그룹이 공개 이름을 사용하는 공개 Google 프로필을 가지고 있는지 확인합니다. 공개 이름을 사용하는 Google 프로필이 있을 경우 Cloud Storage는 <Name> 요소에 공개 이름을 자동으로 채웁니다.

사전 정의된 ACL 적용

위에 나온 것처럼 전체 ACL을 한 번에 하나씩 지정하는 대신, 특정 시나리오에 맞춤설정된 다수의 항목을 자동으로 적용하는 사전 정의된 ACL을 사용할 수 있습니다. gsutil, JSON API, XML API를 사용하여 사전 정의된 ACL을 버킷이나 객체에 적용할 수 있습니다.

새 객체

객체 업로드 중에 사전 정의된 ACL을 객체에 적용하려면 다음과 같이 하세요.

콘솔

GCP Console을 사용하여 사전 정의된 ACL을 적용할 수 없습니다. 대신 gsutil을 사용하세요.

gsutil

-a 옵션을 gsutil cp 명령어와 함께 사용하여 사전 정의된 ACL을 적용합니다.

gsutil cp -a [PREDEFINED_ACL] [OBJECT] gs://[BUCKET_NAME]

예를 들어 객체 paris.jpg를 버킷 example-travel-maps에 업로드하는 동안 사전 정의된 ACL bucket-owner-read를 적용하려면 다음을 입력합니다.

gsutil cp -a bucket-owner-read paris.jpg gs://example-travel-maps

JSON API

insert 요청에 predefinedAcl 쿼리 문자열 매개변수를 사용하여 사전 정의된 ACL을 적용합니다.

예를 들어 객체 paris.jpg를 버킷 example-travel-maps에 업로드하는 동안 사전 정의된 ACL bucketOwnerRead를 적용하려면 다음을 입력합니다.

curl -X POST --data-binary @paris.jpg -H "Content-Type: image/jpeg" 
-H "Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg"
"https://www.googleapis.com/upload/storage/v1/b/example-travel-maps/o?name=paris.jpg&predefinedAcl=bucketOwnerRead"

요청이 다음 예와 비슷하게 됩니다.

POST /upload/storage/v1/b/example-travel-maps/o?name=paris.jpg&amppredefinedAcl=bucketOwnerRead HTTP/1.1
Host: www.googleapis.com
Content-Type: image/jpeg
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg
Content-Length: 12345
Date: Fri, 10 Oct 2014 00:02:38 GMT

XML API

Put Object 요청에 x-goog-acl 헤더를 사용하여 사전 정의된 ACL을 요청합니다.

예를 들어 객체 paris.jpg를 버킷 example-travel-maps에 업로드하는 동안 사전 정의된 ACL bucket-owner-read를 적용하려면 다음을 입력합니다.

curl -X PUT --upload-file paris.jpg -H "x-goog-acl: bucket-owner-read" 
-H "Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg"
https://storage.googleapis.com/example-travel-maps/paris.jpg

요청이 다음 예와 비슷하게 됩니다.

PUT /paris.jpg HTTP/1.1
Host: example-travel-maps.storage.googleapis.com
Date: Thu, 09 Oct 2014 23:06:08 GMT
Content-Length: 12345
Content-Type: image/jpg
x-goog-acl: bucket-owner-read
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

12345 bytes in entity body

기존 버킷 또는 객체

사전 정의된 ACL을 기존 버킷이나 객체에 적용할 수도 있습니다. 이는 하나의 사전 정의된 ACL에서 다른 사전 정의된 ACL로 변경하고자 하거나 커스텀 ACL을 사전 정의된 ACL로 업데이트하고자 하는 경우에 유용합니다.

콘솔

GCP Console을 사용하여 사전 정의된 ACL을 적용할 수 없습니다. 대신 gsutil을 사용하세요.

gsutil

gsutil acl set 명령어를 사용하여 사전 정의된 ACL을 적용합니다.

gsutil acl set [PREDEFINED_ACL] gs://[BUCKET_NAME]/[OBJECT_NAME]

예를 들어 버킷 example-travel-maps에서 사전 정의된 ACL private을 객체 paris.jpg에 적용하려면 다음을 입력합니다.

gsutil acl set private gs://example-travel-maps/paris.jpg

JSON API

predefinedAcl 쿼리 문자열 매개변수를 사용하고 patch 요청에 빈 acl 속성을 지정하여 사전 정의된 ACL을 적용합니다.

예를 들어 버킷 example-travel-maps에서 사전 정의된 ACL private을 객체 paris.jpg에 적용하려면 다음을 입력합니다.

curl -X PATCH --data '{"acl": []}'  -H "Content-Type: application/json" 
-H "Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg"
https://www.googleapis.com/storage/v1/b/example-travel-maps/o/paris.jpg?predefinedAcl=private

요청이 다음 예와 비슷하게 됩니다.

PATCH /storage/v1/b/example-travel-maps/o/paris.jpg?predefinedAcl=private HTTP/1.1
Host: www.googleapis.com
Content-Type: application/json
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg
Content-Length: 11
Date: Fri, 10 Oct 2014 18:57:59 GMT

XML API

Put Object 요청에서 x-goog-acl 헤더를 acl 쿼리 문자열 매개변수와 함께 사용합니다. 하지만 요청에 XML 문서를 포함하지 않습니다.

예를 들어 버킷 example-travel-maps에서 사전 정의된 ACL private을 객체 paris.jpg에 적용하려면 다음을 입력합니다.

curl -X PUT -H "Content-Length: 0" 
-H "Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg"
-H "x-goog-acl: private" https://storage.googleapis.com/example-travel-maps/paris.jpg?acl

요청이 다음 예와 비슷하게 됩니다.

PUT /paris.jpg?acl HTTP/1.1
Host: example-travel-maps.storage.googleapis.com
Date: Thu, 09 Oct 2014 23:14:59 GMT
Content-Length: 0
x-goog-acl: private
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

empty entity body

기본 객체 ACL 설정

새 객체를 생성할 때마다 ACL을 설정할 필요가 없도록 버킷에 기본 객체 ACL을 설정할 수 있습니다. 이후로는 해당 버킷에 추가되는 새 객체마다 명시적으로 적용된 ACL이 없는 객체는 모두 이 기본 객체 ACL이 적용됩니다. 예를 들어 특정 그룹의 사용자만 특정 버킷에서 대부분의 객체에 액세스하도록 지정하고자 할 수 있습니다. 이런 경우 기본 객체 ACL을 변경한 후에 객체를 버킷에 추가하면 됩니다. 이렇게 추가된 객체에는 지정한 기본 객체 ACL이 자동으로 적용됩니다. 하지만 특정 객체에 다른 ACL을 지정할 수도 있습니다. 그러면 이러한 객체에는 기본 ACL이 적용되지 않습니다.

버킷에서 기본 객체 ACL을 확인하고 변경하려면 다음과 같이 하세요.

콘솔

GCP Console을 사용하여 기본 객체 ACL을 설정할 수 없습니다. 대신 gsutil을 사용하세요.

gsutil

  1. gsutil defacl을 사용하여 기본 객체 ACL을 검색합니다.

    gsutil defacl get gs://[BUCKET_NAME]

  2. gsutil defacl ch 또는 gsutil defacl set를 사용하여 기본 객체 ACL을 수정합니다.

    예를 들어 다음 명령어는 jane@gmail.com을 버킷 example-travel-maps의 기본 객체 ACL에 추가합니다.

    gsutil defacl ch -u jane@gmail.com:READER gs://example-travel-maps

    파일에서 기본 객체 ACL을 지정할 수도 있습니다. 자세한 내용은 gsutil defacl의 도움말을 참조하세요.

코드 샘플

C++

자세한 내용은 Cloud Storage C++ API 참조 문서를 참조하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name, std::string entity,
   std::string role) {
  StatusOr<gcs::ObjectAccessControl> default_object_acl =
      client.CreateDefaultObjectAcl(bucket_name, entity, role);

  if (!default_object_acl) {
    throw std::runtime_error(default_object_acl.status().message());
  }

  std::cout << "Role " << default_object_acl->role()
            << " will be granted default to " << default_object_acl->entity()
            << " on any new object created on bucket "
            << default_object_acl->bucket() << "\n"
            << "Full attributes: " << *default_object_acl << "\n";
}

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

namespace gcs = google::cloud::storage;
[](gcs::Client client, std::string bucket_name, std::string entity) {
  google::cloud::Status status =
      client.DeleteDefaultObjectAcl(bucket_name, entity);

  if (!status.ok()) {
    throw std::runtime_error(status.message());
  }

  std::cout << "Deleted ACL entry for " << entity << " in bucket "
            << bucket_name << "\n";
}

C#

자세한 내용은 Cloud Storage C# API 참조 문서를 확인하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

private void AddBucketDefaultOwner(string bucketName, string userEmail)
{
    var storage = StorageClient.Create();
    var bucket = storage.GetBucket(bucketName, new GetBucketOptions()
    {
        Projection = Projection.Full
    });
    if (null == bucket.Acl)
    {
        bucket.Acl = new List<BucketAccessControl>();
    }
    if (null == bucket.DefaultObjectAcl)
    {
        bucket.DefaultObjectAcl = new List<ObjectAccessControl>();
    }
    bucket.DefaultObjectAcl.Add(new ObjectAccessControl()
    {
        Bucket = bucketName,
        Entity = $"user-{userEmail}",
        Role = "OWNER",
    });
    var updatedBucket = storage.UpdateBucket(bucket, new UpdateBucketOptions()
    {
        // Avoid race conditions.
        IfMetagenerationMatch = bucket.Metageneration,
    });
}

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

private void RemoveBucketDefaultOwner(string bucketName, string userEmail)
{
    var storage = StorageClient.Create();
    var bucket = storage.GetBucket(bucketName, new GetBucketOptions()
    {
        Projection = Projection.Full
    });
    if (null == bucket.DefaultObjectAcl)
        return;
    if (null == bucket.Acl)
    {
        bucket.Acl = new List<BucketAccessControl>();
    }
    bucket.DefaultObjectAcl = bucket.DefaultObjectAcl.Where((acl) =>
         !(acl.Entity == $"user-{userEmail}" && acl.Role == "OWNER")
        ).ToList();
    var updatedBucket = storage.UpdateBucket(bucket, new UpdateBucketOptions()
    {
        // Avoid race conditions.
        IfMetagenerationMatch = bucket.Metageneration,
    });
}

Go

자세한 내용은 Cloud Storage Go API 참조 문서를 확인하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

func addDefaultBucketACL(client *storage.Client, bucket string) error {
	ctx := context.Background()

	acl := client.Bucket(bucket).DefaultObjectACL()
	if err := acl.Set(ctx, storage.AllAuthenticatedUsers, storage.RoleReader); err != nil {
		return err
	}
	return nil
}

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

func deleteDefaultBucketACL(client *storage.Client, bucket string) error {
	ctx := context.Background()

	acl := client.Bucket(bucket).DefaultObjectACL()
	if err := acl.Delete(ctx, storage.AllAuthenticatedUsers); err != nil {
		return err
	}
	return nil
}

자바

자세한 내용은 Cloud Storage 자바 API 참조 문서를 확인하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

Acl acl =
    storage.createDefaultAcl(bucketName, Acl.of(User.ofAllAuthenticatedUsers(), Role.READER));

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

boolean deleted = storage.deleteDefaultAcl(bucketName, User.ofAllAuthenticatedUsers());
if (deleted) {
  // the acl entry was deleted
} else {
  // the acl entry was not found
}

Node.js

자세한 내용은 Cloud Storage Node.js API 참조 문서를 확인하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const userEmail = 'Email of user to add, e.g. developer@company.com';

// Makes the user an owner in the default ACL of the bucket. You can use
// addAllUsers(), addDomain(), addProject(), addGroup(), and
// addAllAuthenticatedUsers() to grant access to different types of entities.
// You can also use "readers" and "writers" to grant different roles.
await storage.bucket(bucketName).acl.default.owners.addUser(userEmail);

console.log(`Added user ${userEmail} as an owner on bucket ${bucketName}.`);

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const userEmail = 'Email of user to remove, e.g. developer@company.com';

// Removes the user from the access control list of the bucket. You can use
// deleteAllUsers(), deleteDomain(), deleteProject(), deleteGroup(), and
// deleteAllAuthenticatedUsers() to remove access for different types of entities.
await storage.bucket(bucketName).acl.default.owners.deleteUser(userEmail);

console.log(`Removed user ${userEmail} from bucket ${bucketName}.`);

PHP

자세한 내용은 Cloud Storage PHP API 참조 문서를 확인하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Add an entity and role to a bucket's default ACL.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 * @param string $entity The entity to update access controls for.
 * @param string $role The permissions to add for the specified entity. May
 *        be one of 'OWNER', 'READER', or 'WRITER'.
 * @param array $options
 *
 * @return void
 */
function add_bucket_default_acl($bucketName, $entity, $role, $options = [])
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $acl = $bucket->defaultAcl();
    $acl->add($entity, $role, $options);
    printf('Added %s (%s) to gs://%s default ACL' . PHP_EOL, $entity, $role, $bucketName);
}

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Delete an entity from a bucket's default ACL.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 * @param string $entity the name of the entity to remove from the ACL.
 * @param array $options
 *
 * @return void
 */
function delete_bucket_default_acl($bucketName, $entity, $options = [])
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $acl = $bucket->defaultAcl();
    $acl->delete($entity, $options);
    printf('Deleted %s from gs://%s default ACL' . PHP_EOL, $entity, $bucketName);
}

Python

자세한 내용은 Cloud Storage Python API 참조 문서를 확인하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

def add_bucket_default_owner(bucket_name, user_email):
    """Adds a user as an owner in the given bucket's default object access
    control list."""
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    # Reload fetches the current ACL from Cloud Storage.
    bucket.acl.reload()

    # You can also use `group`, `domain`, `all_authenticated` and `all` to
    # grant access to different types of entities. You can also use
    # `grant_read` or `grant_write` to grant different roles.
    bucket.default_object_acl.user(user_email).grant_owner()
    bucket.default_object_acl.save()

    print('Added user {} as an owner in the default acl on bucket {}.'.format(
        user_email, bucket_name))

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

def remove_bucket_default_owner(bucket_name, user_email):
    """Removes a user from the access control list of the given bucket's
    default object access control list."""
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    # Reload fetches the current ACL from Cloud Storage.
    bucket.acl.reload()

    # You can also use `group`, `domain`, `all_authenticated` and `all` to
    # remove access for different types of entities.
    bucket.default_object_acl.user(user_email).revoke_read()
    bucket.default_object_acl.user(user_email).revoke_write()
    bucket.default_object_acl.user(user_email).revoke_owner()
    bucket.default_object_acl.save()

    print('Removed user {} from the default acl of bucket {}.'.format(
        user_email, bucket_name))

Ruby

자세한 내용은 Cloud Storage Ruby API 참조 문서를 확인하세요.

다음 샘플은 기본 객체 ACL을 버킷에 추가합니다.

# project_id  = "Your Google Cloud project ID"
# bucket_name = "Your Google Cloud Storage bucket name"
# email       = "Google Cloud Storage ACL Entity email"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new project_id: project_id
bucket  = storage.bucket bucket_name

bucket.default_acl.add_owner email

puts "Added default OWNER permission for #{email} to #{bucket_name}"

다음 샘플은 기본 객체 ACL을 버킷에서 삭제합니다.

# project_id  = "Your Google Cloud project ID"
# bucket_name = "Your Google Cloud Storage bucket name"
# email       = "Google Cloud Storage ACL Entity email"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new project_id: project_id
bucket  = storage.bucket bucket_name

bucket.default_acl.delete email

puts "Removed default ACL permissions for #{email} from #{bucket_name}"

JSON API

  1. GET 요청을 사용하여 기본 객체 ACL을 검색합니다. 예를 들면 다음과 같습니다.

    curl -X GET -H "Authorization: Bearer [OAUTH2_TOKEN]" 
    https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]?projection=full

  2. patch 요청을 사용하여 기본 객체 ACL을 바꿉니다. 예를 들어 다음 요청은 기본 객체 ACL을 버킷 example-travel-mapsdefacls.json에 지정된 ACL로 바꿉니다.

    curl -X PATCH --data @defacls.json -H "Content-Type: application/json" -H "Authorization: Bearer [OAUTH2_TOKEN]" 
    https://www.googleapis.com/storage/v1/b/example-travel-maps

    defacls.json의 예:

    {
    "defaultObjectAcl": [
    {
    "email": "jane@gmail.com",
    "entity": "user-jane@gmail.com",
    "role": "READER"
    }
    ]
    }

XML API

  1. 버킷에 맞춘 GET 요청과 ?defaultObjectAcl 매개변수로 기본 객체 ACL을 검색합니다. 예를 들면 다음과 같습니다.

    curl -X GET -H "Authorization: Bearer [OAUTH2_TOKEN]" 
    https://storage.googleapis.com/[BUCKET_NAME]?defaultObjectAcl

  2. 버킷에 맞춘 PUT 요청을 ?defaultObjectAcl 매개변수와 함께 사용하여 기본 객체 ACL을 acls.xml에서 지정된 ACL로 바꿉니다. 예를 들면 다음과 같습니다.

    curl -X PUT --data-binary @acls.xml -H "Authorization: Bearer [OAUTH2_TOKEN]" 
    http://storage.googleapis.com/[BUCKET_NAME]?defaultObjectAcl

    acls.xml의 예:

    <AccessControlList>
    <Entries>
    <Entry>
    <Permission>FULL_CONTROL</Permission>
    <Scope type="GroupByEmail">
    <EmailAddress>travel-companions@googlegroups.com</EmailAddress>
    </Scope>
    </Entry>
    </Entries>
    </AccessControlList>

ACL 구문은 ACL 설정에서 설명합니다. 사전 정의된 ACL을 기본 객체 ACL로 지정할 수도 있습니다.

버킷의 기본 객체 ACL을 사전 정의된 ACL로 설정하려면 다음과 같이 하세요.

콘솔

GCP Console을 사용하여 기본 객체 ACL을 설정할 수 없습니다. 대신 gsutil을 사용하세요.

gsutil

gsutil defacl 명령어를 사전 정의된 ACL의 이름과 함께 사용합니다.

예를 들어 버킷 example-travel-maps에 대해 기본 객체 ACL을 project-private으로 설정하려면 다음을 입력합니다.

gsutil defacl set project-private gs://example-travel-maps

JSON API

PUT 요청과 predefinedAcl 매개변수를 사용합니다.

예를 들면 다음과 같습니다.

curl -X PUT -H "Content-Length: 0" -H "Authorization: Bearer [OAUTH2_TOKEN]" 
https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]?predefinedAcl=private

XML API

버킷에 맞춘 PUT 요청을 ?defaultObjectAcl 매개변수 및 x-goog-acl 헤더와 함께 사용합니다.

예를 들면 다음과 같습니다.

curl -X PUT -H "x-goog-acl: project-private" -H "Content-Length: 0" -H "Authorization: Bearer [OAUTH2_TOKEN]" 
http://storage.googleapis.com/[BUCKET_NAME]?defaultObjectAcl

새로 생성된 버킷에 대한 기본 객체 ACL:

아래는 새로 생성된 버킷에 대한 기본 객체 ACL입니다. 새로 생성된 것과 버킷의 기본 객체 ACL과 비교하여 버킷의 기본 객체 ACL이 수정되었는지 확인합니다.

콘솔

GCP Console을 사용하여 기본 객체 ACL을 작업할 수 없습니다. 대신 gsutil을 사용하세요.

gsutil

아래의 예에서 프로젝트 ID는 '123412341234'입니다. 사용자의 프로젝트 ID는 다릅니다.

[
{
"entity": "project-owners-123412341234",
"projectTeam": {
  "projectNumber": "123412341234",
  "team": "owners"
},
"role": "OWNER"
},
{
"entity": "project-editors-123412341234",
"projectTeam": {
  "projectNumber": "123412341234",
  "team": "editors"
},
"role": "OWNER"
},
{
"entity": "project-viewers-123412341234",
"projectTeam": {
  "projectNumber": "123412341234",
  "team": "viewers"
},
"role": "READER"
}
]

JSON API

아래의 예에서 프로젝트 ID는 '123412341234'입니다. 사용자의 프로젝트 ID는 다릅니다.

defaultObjectAcl": [
{
"kind": "storage#objectAccessControl",
"entity": "project-owners-123412341234",
"role": "OWNER",
"projectTeam": {
"projectNumber": "123412341234",
"team": "owners"
}
},
{
"kind": "storage#objectAccessControl",
"entity": "project-editors-123412341234",
"role": "OWNER",
"projectTeam": {
"projectNumber": "123412341234",
"team": "editors"
}
},
{
"kind": "storage#objectAccessControl",
"entity": "project-viewers-123412341234",
"role": "READER",
"projectTeam": {
"projectNumber": "123412341234",
"team": "viewers"
}
}
]

XML API

아래의 예에서 프로젝트 역할 ID는 '00b4903a97...'로 시작됩니다. 사용자의 프로젝트 ID는 다릅니다.

<?xml version='1.0' encoding='UTF-8'?>
<AccessControlList>
<Entries>
<Entry>
  <Scope type='GroupById'>
    <ID>00b4903a9721...</ID>
  </Scope>
  <Permission>FULL_CONTROL</Permission>
</Entry>
<Entry>
  <Scope type='GroupById'>
    <ID>00b4903a9722...</ID>
  </Scope>
  <Permission>FULL_CONTROL</Permission>
</Entry>
<Entry>
  <Scope type='GroupById'>
    <ID>00b4903a9723...</ID>
  </Scope>
  <Permission>READ</Permission>
</Entry>
</Entries>
</AccessControlList>

새로 생성된 버킷의 기본 객체 ACL이 사전 정의된 projectPrivate ACL과 동일합니다.

ACL 검색

기존 버킷 또는 객체의 ACL를 가져오려면 다음과 같이 하세요.

콘솔

  1. GCP Console에서 Cloud Storage 브라우저로 이동합니다.
    Cloud Storage 브라우저로 이동

  2. ACL을 조회할 객체로 이동합니다.

  3. 객체의 드롭다운 메뉴에서 권한 수정을 선택합니다.

    객체의 권한이 표시되는 권한 대화 상자가 나타납니다.

gsutil

gsutil acl get을 사용하여 객체의 ACL을 반환합니다.

예를 들어 버킷 example-travel-maps에서 객체 paris.jpg의 ACL을 반환하려면 다음을 입력합니다.

gsutil acl get gs://example-travel-maps/paris.jpg

응답 예:

[
{
    "entity": "project-owners-123412341234",
    "projectTeam": {
      "projectNumber": "123412341234",
      "team": "owners"
    },
    "role": "OWNER"
},
{
    "entity": "project-editors-123412341234",
    "projectTeam": {
      "projectNumber": "123412341234",
      "team": "editors"
    },
    "role": "OWNER"
},
{
    "entity": "project-viewers-123412341234",
    "projectTeam": {
      "projectNumber": "123412341234",
      "team": "viewers"
    },
    "role": "READER"
},
{
    "email": "gs-announce@googlegroups.com",
    "entity": "group-gs-announce@googlegroups.com",
    "role": "READER"
},
{
    "email": "jane@gmail.com",
    "entity": "user-jane@gmail.com",
    "role": "READER"
},
{
    "entity": "allUsers",
    "role": "READER"
},
{
    "entity": "allAuthenticatedUsers",
    "role": "READER"
}
]

버킷의 ACL을 반환하려면 다음을 입력합니다.

gsutil acl get gs://[BUCKET_NAME]

gsutil이 gsutil acl get을 통해 반환되는 버킷과 객체의 ACL은 ACL을 설정하는 데 사용할 수 있는 JSON 형식 그대로입니다. JSON 형식의 ACL은 entity, role 등의 JSON API 속성 이름을 사용합니다.

출력을 해석하는 방법에 대한 자세한 내용은 JSON API 구문을 참조하거나 gsutil help acls를 실행하세요.

코드 샘플

C++

자세한 내용은 Cloud Storage C++ API 참조 문서를 참조하세요.

다음 샘플은 버킷 ACL을 가져옵니다.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name) {
  StatusOr<std::vector<gcs::BucketAccessControl>> items =
      client.ListBucketAcl(bucket_name);

  if (!items) {
    throw std::runtime_error(items.status().message());
  }

  std::cout << "ACLs for bucket=" << bucket_name << "\n";
  for (gcs::BucketAccessControl const& acl : *items) {
    std::cout << acl.role() << ":" << acl.entity() << "\n";
  }
}

다음 샘플은 객체 ACL을 가져옵니다.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name, std::string object_name) {
  StatusOr<std::vector<gcs::ObjectAccessControl>> items =
      client.ListObjectAcl(bucket_name, object_name);

  if (!items) {
    throw std::runtime_error(items.status().message());
  }

  std::cout << "ACLs for object=" << object_name << " in bucket "
            << bucket_name << "\n";
  for (gcs::ObjectAccessControl const& acl : *items) {
    std::cout << acl.role() << ":" << acl.entity() << "\n";
  }
}

C#

자세한 내용은 Cloud Storage C# API 참조 문서를 확인하세요.

다음 샘플은 버킷 ACL을 가져옵니다.

private void PrintBucketAcl(string bucketName)
{
    var storage = StorageClient.Create();
    var bucket = storage.GetBucket(bucketName, new GetBucketOptions()
    {
        Projection = Projection.Full
    });
    if (bucket.Acl != null)
        foreach (var acl in bucket.Acl)
        {
            Console.WriteLine($"{acl.Role}:{acl.Entity}");
        }
}

다음 샘플은 객체 ACL을 가져옵니다.

private void PrintObjectAcl(string bucketName, string objectName)
{
    var storage = StorageClient.Create();
    var storageObject = storage.GetObject(bucketName, objectName,
        new GetObjectOptions() { Projection = Projection.Full });
    if (storageObject.Acl != null)
    {
        foreach (var acl in storageObject.Acl)
        {
            Console.WriteLine($"{acl.Role}:{acl.Entity}");
        }
    }
}

Go

자세한 내용은 Cloud Storage Go API 참조 문서를 확인하세요.

다음 샘플은 버킷 ACL을 가져옵니다.

func bucketACL(client *storage.Client, bucket string) error {
	ctx := context.Background()

	rules, err := client.Bucket(bucket).ACL().List(ctx)
	if err != nil {
		return err
	}
	for _, rule := range rules {
		fmt.Printf("ACL rule: %v\n", rule)
	}
	return nil
}

다음 샘플은 객체 ACL을 가져옵니다.

func objectACL(client *storage.Client, bucket, object string) error {
	ctx := context.Background()

	rules, err := client.Bucket(bucket).Object(object).ACL().List(ctx)
	if err != nil {
		return err
	}
	for _, rule := range rules {
		fmt.Printf("ACL rule: %v\n", rule)
	}
	return nil
}

자바

자세한 내용은 Cloud Storage 자바 API 참조 문서를 확인하세요.

다음 샘플은 버킷 ACL을 가져옵니다.

Acl acl = storage.getAcl(bucketName, User.ofAllAuthenticatedUsers());

다음 샘플은 객체 ACL을 가져옵니다.

BlobId blobId = BlobId.of(bucketName, blobName, blobGeneration);
Acl acl = storage.getAcl(blobId, User.ofAllAuthenticatedUsers());

Node.js

자세한 내용은 Cloud Storage Node.js API 참조 문서를 확인하세요.

다음 샘플은 버킷 ACL을 가져옵니다.

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';

// Gets the ACL for the bucket
const [acls] = await storage.bucket(bucketName).acl.get();

acls.forEach(acl => {
  console.log(`${acl.role}: ${acl.entity}`);
});

다음 샘플은 객체 ACL을 가져옵니다.

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const filename = 'File to access, e.g. file.txt';

// Gets the ACL for the file
const [acls] = await storage
  .bucket(bucketName)
  .file(filename)
  .acl.get();

acls.forEach(acl => {
  console.log(`${acl.role}: ${acl.entity}`);
});

PHP

자세한 내용은 Cloud Storage PHP API 참조 문서를 확인하세요.

다음 샘플은 버킷 ACL을 가져옵니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Print all entities and roles for a bucket's ACL.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 *
 * @return Google\Cloud\Storage\Acl the ACL for the Cloud Storage bucket.
 */
function get_bucket_acl($bucketName)
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $acl = $bucket->acl();
    foreach ($acl->get() as $item) {
        printf('%s: %s' . PHP_EOL, $item['entity'], $item['role']);
    }
}

다음 샘플은 객체 ACL을 가져옵니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Print all entities and roles for an object's ACL.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 * @param string $objectName the name of your Cloud Storage object.
 *
 * @return void
 */
function get_object_acl($bucketName, $objectName)
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $object = $bucket->object($objectName);
    $acl = $object->acl();
    foreach ($acl->get() as $item) {
        printf('%s: %s' . PHP_EOL, $item['entity'], $item['role']);
    }
}

Python

자세한 내용은 Cloud Storage Python API 참조 문서를 확인하세요.

다음 샘플은 버킷 ACL을 가져옵니다.

def print_bucket_acl(bucket_name):
    """Prints out a bucket's access control list."""
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    for entry in bucket.acl:
        print('{}: {}'.format(entry['role'], entry['entity']))

다음 샘플은 객체 ACL을 가져옵니다.

def print_blob_acl(bucket_name, blob_name):
    """Prints out a blob's access control list."""
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)

    for entry in blob.acl:
        print('{}: {}'.format(entry['role'], entry['entity']))

Ruby

자세한 내용은 Cloud Storage Ruby API 참조 문서를 확인하세요.

다음 샘플은 버킷 ACL을 가져옵니다.

# project_id  = "Your Google Cloud project ID"
# bucket_name = "Your Google Cloud Storage bucket name"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new project_id: project_id
bucket  = storage.bucket bucket_name

puts "ACL for #{bucket_name}:"

bucket.acl.owners.each do |owner|
  puts "OWNER #{owner}"
end

bucket.acl.writers.each do |writer|
  puts "WRITER #{writer}"
end

bucket.acl.readers.each do |reader|
  puts "READER #{reader}"
end

다음 샘플은 객체 ACL을 가져옵니다.

# project_id  = "Your Google Cloud project ID"
# bucket_name = "Your Google Cloud Storage bucket name"
# file_name   = "Name of a file in the Storage bucket"
# email       = "Google Cloud Storage ACL Entity email"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new project_id: project_id
bucket  = storage.bucket bucket_name
file    = bucket.file file_name

puts "ACL for #{file_name} in #{bucket_name}:"

file.acl.owners.each do |owner|
  puts "OWNER #{owner}"
end

file.acl.readers.each do |reader|
  puts "READER #{reader}"
end

JSON API

  1. 버킷 또는 객체에 대한 OWNER 권한이 있는지 확인합니다.

  2. GET 요청으로 버킷 또는 객체의 ACL을 검색합니다.

    객체 ACL이 JSON 형식으로 반환되고 응답 본문에 첨부됩니다.

예를 들어 버킷 example-travel-maps에서 객체 paris.jpg의 ACL을 반환하려면 다음을 입력합니다.

curl -X GET -H "Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg" 
https://www.googleapis.com/storage/v1/b/example-travel-maps/o/paris.jpg?projection=full

다음과 비슷한 응답이 표시될 것입니다.

{
"kind": "storage#object",
"id": "example-travel-maps/paris.jpg/1412805837131000",
"selfLink": "https://www.googleapis.com/storage/v1/b/example-travel-maps/o/paris.jpg",
"name": "paris.jpg",
"bucket": "example-travel-maps",
...
"acl": [
{
...
"entity": "project-owners-867489160491",
"role": "OWNER",
"projectTeam": {
    "projectNumber": "867489160491",
    "team": "owners"
},
...
},
{
...
"entity": "user-jane@gmail.com",
"role": "OWNER",
"email": "jane@gmail.com",
...
},
{
...
"entity": "group-gs-announce@googlegroups.com",
"role": "READER",
"email": "gs-announce@googlegroups.com",
...
}
],
"owner": {
"entity": "user-jane@gmail.com"
},
...
}

objectAccessControls 리소스 GET 메소드를 사용하여 객체의 ACL에 있는 개별 항목을 반환할 수도 있습니다.

XML API

  1. 버킷 또는 객체에 대한 FULL_CONTROL 권한이 있는지 확인합니다.

  2. GET Object 요청에서 acl 쿼리 문자열 매개변수를 사용하여 버킷 또는 객체의 ACL을 검색합니다.

ACL은 XML로 표시되고 응답의 본문에 첨부됩니다.

예를 들어 버킷 example-travel-maps에서 객체 paris.jpg의 ACL을 반환하려면 다음을 입력합니다.

curl -X GET -H "Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg" 
https://storage.googleapis.com/example-travel-maps/paris.jpg?acl

다음과 비슷한 응답이 표시됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<AccessControlList>
<Owner>
<ID>84fac329bceSAMPLE777d5d22b8SAMPLE77d85ac2SAMPLE2dfcf7c4adf34da46</ID>
<Name>Owner Name</Name>
</Owner>
<Entries>
<Entry>
  <Scope type="UserById">
    <ID>84fac329bceSAMPLE777d5d22b8SAMPLE77d85ac2SAMPLE2dfcf7c4adf34da46</ID>
    <Name>Name</Name>
  </Scope>
  <Permission>FULL_CONTROL</Permission>
</Entry>
<Entry>
  <Scope type="UserByEmail">
    <EmailAddress>jane@gmail.com</EmailAddress>
    <Name>Jane</Name>
  </Scope>
  <Permission>FULL_CONTROL</Permission>
</Entry>
<Entry>
  <Scope type="GroupByEmail">
    <EmailAddress>gs-announce@googlegroups.com</EmailAddress>
  </Scope>
  <Permission>READ</Permission>
</Entry>
</Entries>
</AccessControlList>

ObjectAccessControls 리소스의 JSON GET 메소드를 사용하여 특정 ACL 항목을 반환할 수도 있습니다.

ACL 변경

기존 객체 또는 버킷의 ACL을 변경하려면 다음과 같이 하세요.

콘솔

  1. GCP Console에서 Cloud Storage 브라우저로 이동합니다.
    Cloud Storage 브라우저로 이동

  2. ACL을 변경할 객체로 이동합니다.

  3. 객체의 드롭다운 메뉴에서 권한 수정을 선택합니다.

    객체의 권한이 표시되는 권한 대화 상자가 나타납니다.

다음 예는 객체 paris.jpg에 대해 jane@gmail.com 사용자에게 OWNER 권한을 부여하고 gs-announce 그룹 구성원에게 READER 권한을 부여하는 방법을 보여줍니다.

객체 paris.jpg에서 ACL 설정

gsutil

  1. 파일에서 ACL을 정의합니다.

  2. ACL 파일을 gsutil acl set에 전달하고 ACL을 설정할 객체를 지정합니다.

예를 들어 버킷 example-travel-maps에서 paris.jpg라는 객체에 파일 acls.txt의 ACL을 적용하려면 다음을 입력합니다.

gsutil acl set acl.txt gs://example-travel-maps/paris.jpg

acl.txt의 내용이 아래에 표시되어 있습니다. 이 ACL은 프로젝트 867489160491의 소유자와 jane@gmail.com 사용자에게 객체 paris.jpg에 대한 OWNER 권한을 부여하고 gs-announce 그룹 구성원에게 이 객체에 대한 READER 권한을 부여합니다.

[
{
"entity": "project-owners-867489160491",
"role": "OWNER",
"projectTeam": {
    "projectNumber": "867489160491",
    "team": "owners"
},
},
{
"entity": "user-jane@gmail.com",
"email": "jane@gmail.com",
"role": "OWNER"
},
{
"entity": "group-gs-announce@googlegroups.com",
"email": "gs-announce@googlegroups.com",
"role": "READER"
}
]

개별 부여를 통해 이 객체에 동일한 ACL을 설정할 수도 있습니다. 예를 들어 jane@gmail.com 사용자에게 READER 액세스 권한을 부여하려면 다음을 사용합니다.

gsutil acl ch -u jane@gmail.com:READ gs://example-travel-maps/paris.jpg
.

코드 샘플

C++

자세한 내용은 Cloud Storage C++ API 참조 문서를 참조하세요.

다음 샘플은 ACL을 버킷에서 삭제합니다.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name, std::string entity) {
  StatusOr<gcs::BucketMetadata> original_metadata =
      client.GetBucketMetadata(bucket_name, gcs::Projection::Full());

  if (!original_metadata) {
    throw std::runtime_error(original_metadata.status().message());
  }

  std::vector<gcs::BucketAccessControl> original_acl =
      original_metadata->acl();
  auto it = std::find_if(original_acl.begin(), original_acl.end(),
                         [entity](const gcs::BucketAccessControl& entry) {
                           return entry.entity() == entity &&
                                  entry.role() ==
                                      gcs::BucketAccessControl::ROLE_OWNER();
                         });

  if (it == original_acl.end()) {
    std::cout << "Could not find entity " << entity
              << " with role OWNER in bucket " << bucket_name << "\n";
    return;
  }

  gcs::BucketAccessControl owner = *it;
  google::cloud::Status status =
      client.DeleteBucketAcl(bucket_name, owner.entity());

  if (!status.ok()) {
    throw std::runtime_error(status.message());
  }

  std::cout << "Deleted ACL entry for " << owner.entity() << " in bucket "
            << bucket_name << "\n";
}

다음 샘플은 ACL을 객체에서 삭제합니다.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name, std::string object_name,
   std::string entity) {
  StatusOr<gcs::ObjectMetadata> original_metadata = client.GetObjectMetadata(
      bucket_name, object_name, gcs::Projection::Full());

  if (!original_metadata) {
    throw std::runtime_error(original_metadata.status().message());
  }

  std::vector<gcs::ObjectAccessControl> original_acl =
      original_metadata->acl();
  auto it = std::find_if(original_acl.begin(), original_acl.end(),
                         [entity](const gcs::ObjectAccessControl& entry) {
                           return entry.entity() == entity &&
                                  entry.role() ==
                                      gcs::ObjectAccessControl::ROLE_OWNER();
                         });

  if (it == original_acl.end()) {
    std::cout << "Could not find entity " << entity << " for file "
              << object_name << " with role OWNER in bucket " << bucket_name
              << "\n";
    return;
  }

  gcs::ObjectAccessControl owner = *it;
  google::cloud::Status status =
      client.DeleteObjectAcl(bucket_name, object_name, owner.entity());

  if (!status.ok()) {
    throw std::runtime_error(status.message());
  }

  std::cout << "Deleted ACL entry for " << owner.entity() << " for file "
            << object_name << " in bucket " << bucket_name << "\n";
}

C#

자세한 내용은 Cloud Storage C# API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에서 삭제합니다.

private void RemoveBucketOwner(string bucketName, string userEmail)
{
    var storage = StorageClient.Create();
    var bucket = storage.GetBucket(bucketName, new GetBucketOptions()
    {
        Projection = Projection.Full
    });
    if (null == bucket.Acl)
        return;
    bucket.Acl = bucket.Acl.Where((acl) =>
        !(acl.Entity == $"user-{userEmail}" && acl.Role == "OWNER")
        ).ToList();
    var updatedBucket = storage.UpdateBucket(bucket, new UpdateBucketOptions()
    {
        // Avoid race conditions.
        IfMetagenerationMatch = bucket.Metageneration,
    });
}

다음 샘플은 ACL을 객체에서 삭제합니다.

private void RemoveObjectOwner(string bucketName, string objectName,
    string userEmail)
{
    var storage = StorageClient.Create();
    var storageObject = storage.GetObject(bucketName, objectName,
        new GetObjectOptions() { Projection = Projection.Full });
    if (null == storageObject.Acl)
        return;
    storageObject.Acl = storageObject.Acl.Where((acl) =>
        !(acl.Entity == $"user-{userEmail}" && acl.Role == "OWNER")
        ).ToList();
    var updatedObject = storage.UpdateObject(storageObject, new UpdateObjectOptions()
    {
        // Avoid race conditions.
        IfMetagenerationMatch = storageObject.Metageneration,
    });
}

Go

자세한 내용은 Cloud Storage Go API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에서 삭제합니다.

func deleteBucketACL(client *storage.Client, bucket string) error {
	ctx := context.Background()

	acl := client.Bucket(bucket).ACL()
	if err := acl.Delete(ctx, storage.AllAuthenticatedUsers); err != nil {
		return err
	}
	return nil
}

다음 샘플은 ACL을 객체에서 삭제합니다.

func deleteObjectACL(client *storage.Client, bucket, object string) error {
	ctx := context.Background()

	acl := client.Bucket(bucket).Object(object).ACL()
	if err := acl.Delete(ctx, storage.AllAuthenticatedUsers); err != nil {
		return err
	}
	return nil
}

자바

자세한 내용은 Cloud Storage 자바 API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에서 삭제합니다.

boolean deleted = storage.deleteAcl(bucketName, User.ofAllAuthenticatedUsers());
if (deleted) {
  // the acl entry was deleted
} else {
  // the acl entry was not found
}

다음 샘플은 ACL을 객체에서 삭제합니다.

BlobId blobId = BlobId.of(bucketName, blobName, blobGeneration);
boolean deleted = storage.deleteAcl(blobId, User.ofAllAuthenticatedUsers());
if (deleted) {
  // the acl entry was deleted
} else {
  // the acl entry was not found
}

Node.js

자세한 내용은 Cloud Storage Node.js API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에서 삭제합니다.

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const userEmail = 'Email of user to remove, e.g. developer@company.com';

// Removes the user from the access control list of the bucket. You can use
// deleteAllUsers(), deleteDomain(), deleteProject(), deleteGroup(), and
// deleteAllAuthenticatedUsers() to remove access for different types of entities.
await storage.bucket(bucketName).acl.owners.deleteUser(userEmail);

console.log(`Removed user ${userEmail} from bucket ${bucketName}.`);

다음 샘플은 ACL을 객체에서 삭제합니다.

async function removeFileOwner(bucketName, filename, userEmail) {
  // Imports the Google Cloud client library
  const {Storage} = require('@google-cloud/storage');

  // Creates a client
  const storage = new Storage();

  /**
   * TODO(developer): Uncomment the following line before running the sample.
   */
  // const bucketName = 'Name of a bucket, e.g. my-bucket';
  // const filename = 'Name of file to access, e.g. file.txt';
  // const userEmail = 'Email of user to remove, e.g. developer@company.com';

  // Removes the user from the access control list of the file. You can use
  // deleteAllUsers(), deleteDomain(), deleteProject(), deleteGroup(), and
  // deleteAllAuthenticatedUsers() to remove access for different types of entities.
  await storage
    .bucket(bucketName)
    .file(filename)
    .acl.owners.deleteUser(userEmail);

  console.log(`Removed user ${userEmail} from file ${filename}.`);

PHP

자세한 내용은 Cloud Storage PHP API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에서 삭제합니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Delete an entity from a bucket's default ACL.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 * @param string $entity the name of the entity to remove from the ACL.
 * @param array $options
 *
 * @return void
 */
function delete_bucket_acl($bucketName, $entity, $options = [])
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $acl = $bucket->acl();
    $acl->delete($entity, $options);
    printf('Deleted %s from gs://%s ACL' . PHP_EOL, $entity, $bucketName);
}

다음 샘플은 ACL을 객체에서 삭제합니다.

use Google\Cloud\Storage\StorageClient;

/**
 * Delete an entity from an object's ACL.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 * @param string $objectName the name of your Cloud Storage object.
 * @param string $entity The entity to update access controls for.
 * @param array $options
 *
 * @return void
 */
function delete_object_acl($bucketName, $objectName, $entity, $options = [])
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $object = $bucket->object($objectName);
    $acl = $object->acl();
    $acl->delete($entity, $options);
    printf('Deleted %s from gs://%s/%s ACL' . PHP_EOL, $entity, $bucketName, $objectName);
}

Python

자세한 내용은 Cloud Storage Python API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에서 삭제합니다.

def remove_bucket_owner(bucket_name, user_email):
    """Removes a user from the access control list of the given bucket."""
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    # Reload fetches the current ACL from Cloud Storage.
    bucket.acl.reload()

    # You can also use `group`, `domain`, `all_authenticated` and `all` to
    # remove access for different types of entities.
    bucket.acl.user(user_email).revoke_read()
    bucket.acl.user(user_email).revoke_write()
    bucket.acl.user(user_email).revoke_owner()
    bucket.acl.save()

    print('Removed user {} from bucket {}.'.format(
        user_email, bucket_name))

다음 샘플은 ACL을 객체에서 삭제합니다.

def remove_blob_owner(bucket_name, blob_name, user_email):
    """Removes a user from the access control list of the given blob in the
    given bucket."""
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)

    # You can also use `group`, `domain`, `all_authenticated` and `all` to
    # remove access for different types of entities.
    blob.acl.user(user_email).revoke_read()
    blob.acl.user(user_email).revoke_write()
    blob.acl.user(user_email).revoke_owner()
    blob.acl.save()

    print('Removed user {} from blob {} in bucket {}.'.format(
        user_email, blob_name, bucket_name))

Ruby

자세한 내용은 Cloud Storage Ruby API 참조 문서를 확인하세요.

다음 샘플은 ACL을 버킷에서 삭제합니다.

# project_id  = "Your Google Cloud project ID"
# bucket_name = "Your Google Cloud Storage bucket name"
# email       = "Google Cloud Storage ACL Entity email"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new project_id: project_id
bucket  = storage.bucket bucket_name

bucket.acl.delete email

puts "Removed ACL permissions for #{email} from #{bucket_name}"

다음 샘플은 ACL을 객체에서 삭제합니다.

# project_id  = "Your Google Cloud project ID"
# bucket_name = "Your Google Cloud Storage bucket name"
# file_name   = "Name of a file in the Storage bucket"
# email       = "Google Cloud Storage ACL Entity email"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new project_id: project_id
bucket  = storage.bucket bucket_name
file    = bucket.file file_name

file.acl.delete email

puts "Removed ACL permissions for #{email} from #{file_name}"

JSON API

  1. JSON 파일에서 ACL을 정의합니다.

  2. patch 요청을 JSON 파일과 함께 보내고, ACL을 설정할 객체를 지정합니다.

예를 들어 다음 cURL 명령은 문서 acls.json의 JSON 페이로드를 버킷 example-travel-maps에서 paris.jpg라는 객체에 적용합니다.

curl -X PATCH --data @acls.json -H "Content-Type: application/json" 
-H "Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg"
https://www.googleapis.com/storage/v1/b/example-travel-maps/o/paris.jpg

ACL이 프로젝트 867489160491의 소유자와 jane@gmail.com 사용자에게 OWNER 권한을 부여하고 gs-announce 그룹 구성원에게 READER 권한을 부여하면 요청이 다음 예와 비슷하게 됩니다.

PATCH /storage/v1/b/example-travel-maps/o/paris.jpg HTTP/1.1
Host: www.googleapis.com
Content-Type: application/json
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg
Content-Length: 597
Date: Wed, 08 Oct 2014 22:37:58 GMT
{
"acl": [
{
"entity": "project-owners-867489160491",
"role": "OWNER",
"projectTeam": {
    "projectNumber": "867489160491",
    "team": "owners"
},
{
"entity": "user-jane@gmail.com",
"role": "OWNER",
"email": "jane@gmail.com"
},
{
"entity": "group-gs-announce@googlegroups.com",
"role": "READER",
"email": "gs-announce@googlegroups.com"
}
]
}

XML API

  1. XML 문서에서 ACL을 정의합니다.

  2. acl 쿼리 문자열 매개변수 및 해당하는 XML 문서를 사용하여 PUT Object 요청을 보냅니다.

다음 cURL 명령어는 문서 acls.xml의 XML 페이로드를 버킷 example-travel-mapsparis.jpg라는 객체에 적용합니다.

curl -X PUT --data-binary @acls.xml 
-H "Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg"
https://storage.googleapis.com/example-travel-maps/paris.jpg?acl

ACL이 jane@gmail.com 사용자에게 FULL_CONTROL 권한을 부여하고 gs-announce 그룹 구성원에게 READ 권한을 부여하면 다음 예와 비슷한 요청이 표시됩니다.

PUT /paris.jpg?acl HTTP/1.1
Host: example-travel-maps.storage.googleapis.com
Date: Sat, 20 Feb 2010 08:31:08 GMT
Content-Length: 589
Content-Type=application/xml
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

<?xml version='1.0' encoding='utf-8'?>
<AccessControlList>
<Owner>
<ID>84fac329bceSAMPLE777d5d22b8SAMPLE77d85ac2SAMPLE2dfcf7c4adf34da46</ID>
</Owner>
<Entries>
<Entry>
<Permission>FULL_CONTROL</Permission>
<Scope type="UserById">
  <ID>84fac329bceSAMPLE777d5d22b8SAMPLE77d85ac2SAMPLE2dfcf7c4adf34da46</ID>
</Scope>
</Entry>
<Entry>
<Scope type="UserByEmail">
  <EmailAddress>jane@gmail.com</EmailAddress>
  <Name>Jane</Name>
</Scope>
<Permission>FULL_CONTROL</Permission>
</Entry>
<Entry>
<Scope type="GroupByEmail">
  <EmailAddress>gs-announce@googlegroups.com</EmailAddress>
</Scope>
<Permission>READ</Permission>
</Entry>
</Entries>
</AccessControlList>

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.