액세스 제어

Prev Next

Classic/VPC 환경에서 이용 가능합니다.

Ncloud Storage 서비스에서는 버킷 정책, 퍼블릭 액세스 차단, CORS 기능을 통해 버킷과 객체의 보안을 관리할 수 있습니다. 버킷과 객체에 대한 접근 권한을 제어하고, 의도하지 않은 공개를 방지하며, 다른 출처의 리소스 접근을 관리할 수 있습니다.

버킷 정책

버킷 정책은 생성한 버킷과 그 내부의 객체에 대한 액세스 권한을 부여할 수 있는 리소스 기반 정책입니다. 버킷 소유자만 정책을 버킷에 연결할 수 있습니다. Ncloud Storage 버킷 정책의 구성 요소와 예제는 아래와 같습니다.

버킷 정책 설정

버킷에 적용될 접근 제어 정책을 생성하거나 수정할 수 있습니다.

  1. 버킷 목록에서 버킷을 선택한 후 버킷 정책 영역의 i-objectstorage_enlargement를 클릭해 주십시오.
  2. 버킷 정책 팝업 창에서 수정을 선택해 주십시오.
  3. 버킷 정책 수정 팝업 창에 JSON 형식으로 작성한 정책을 입력한 후 [확인] 버튼을 클릭해 주십시오.
    • 버킷 정책은 최대 20KB까지 입력할 수 있습니다.
    • 버킷 정책에 대한 상세 내용은 버킷 정책 요소를 참조해 주십시오.
  4. 버킷 정책 팝업 창에서 작성된 내용을 확인한 후 [확인] 버튼을 클릭해 주십시오.
    • 버킷 정책 팝업 창에서 [확인] 버튼을 클릭하지 않으면 작성된 정책이 적용되지 않습니다.
주의

퍼블릭 액세스 차단이 설정된 경우, 퍼블릭 액세스를 허용하는 버킷 정책의 설정 또는 적용이 제한될 수 있습니다. 버킷을 공개하려면 퍼블릭 액세스 차단 설정을 확인해 주십시오.

참고

Ncloud Storage는 ACL(액세스 제어 목록)을 제공하지 않습니다. 객체 소유권은 항상 버킷 소유자로 고정되며, 다른 계정이 객체를 업로드해도 소유자는 버킷 소유 계정입니다. 따라서 공개 여부를 포함한 모든 접근 제어는 계정 기반 정책과 버킷 정책만으로 수행합니다.

버킷 정책 삭제

버킷에 적용되어 있는 정책을 삭제할 수 있습니다.

  1. 버킷 목록에서 버킷을 선택한 후 버킷 정책 영역의 i-objectstorage_enlargement를 클릭해 주십시오.
  2. 버킷 정책 팝업 창에서 삭제를 선택해 주십시오.
  3. 버킷 정책 삭제 팝업 창에서 [확인] 버튼을 클릭해 주십시오.
    • [확인] 버튼을 클릭하면 설정된 정책이 삭제되며 해당 정책에 정의된 접근 권한이 더 이상 적용되지 않습니다. 삭제한 정책은 복구할 수 없습니다.

버킷 정책 요소

요소 필수 설명
Version 선택 정책 언어 버전. 생략하면 저장 시 2008-10-17로 채워짐
Id 선택 정책 문서를 식별하기 위한 선택 항목
Statement 필수 개별 권한 규칙의 목록
Sid 선택 Statement를 식별하기 위한 선택 항목
Effect 필수 요청을 허용(Allow)하거나 거부(Deny)하도록 지정
Principal 필수 정책이 적용되는 요청 주체. NRN 형식으로 지정
Action 필수 허용 또는 거부할 작업
Resource 필수 정책이 적용되는 버킷 또는 오브젝트. NRN 형식으로 지정
Condition 선택 정책을 적용할 조건

작성 시 주의사항

버킷 정책을 작성할 때 다음 사항을 확인해 주십시오.

  • 정책은 JSON 형식으로 작성해야 합니다.
  • 정책 크기는 최대 20KB입니다.
  • Resource에는 현재 버킷에 속한 리소스만 지정할 수 있습니다.
  • 명시적인 Deny는 Allow보다 우선 적용됩니다.
  • "Principal": "*"을 지정하면 버킷 또는 오브젝트가 외부에 공개될 수 있으므로 주의해 주십시오.
  • 퍼블릭 액세스 차단이 설정된 경우, 퍼블릭 액세스를 허용하는 버킷 정책의 생성 또는 적용이 제한될 수 있습니다.
  • 지원하지 않는 Statement 요소, Condition Key 또는 Operator를 사용하면 정책 저장 시 오류가 발생할 수 있습니다. 단, NotAction과 같이 일부 유효성 검사가 적용되지 않는 요소는 잘못된 값을 입력해도 정책이 저장될 수 있으므로, 정책 저장 전 지원 범위와 입력값을 반드시 확인해 주십시오.

Principal

정책을 적용할 요청 주체를 지정합니다. 여러 Principal을 배열로 지정한 경우, 하나 이상의 Principal이 일치하면 해당 요청 주체에 정책이 적용됩니다. 계정 전체(Customer/static)를 지정하면 해당 계정의 메인 계정, 서브 계정 및 역할이 포함됩니다. 다른 계정의 요청을 허용하려면 요청자 계정의 권한(IAM)과 버킷 정책에서 모두 허용되어야 합니다.

모든 사용자에게 적용하려면 다음과 같이 설정합니다.

"Principal": "*"

특정 계정 또는 사용자를 지정하는 경우 Ncloud Resource Name(NRN)을 사용합니다.
메인 계정의 NRN은 네이버 클라우드 플랫폼 콘솔의 우측 상단 My Account > 계정 및 보안 관리 > 계정 관리 > 계정 정보 > NRN에서 확인할 수 있습니다.

"Principal": {
  "NCP": "nrn:PUB:Account::{accountNo}:Customer/static"
}

여러 Principal을 지정할 수도 있습니다.

"Principal": {
  "NCP": [
    "nrn:PUB:Account::{accountNo1}:Customer/static",
    "nrn:PUB:IAM::{accountNo2}:SubAccount/{subAccountId}"
  ]
}
주의

타계정 Subaccount에 접근 권한을 부여하는 경우, 해당 서브 계정에 대한 정책은 리소스 지정 여부를 끈 상태(리소스 지정 대상: 모든 리소스) 정책을 생성해야 합니다. 특정 버킷만 지정하면 버킷 정책으로 허용되어 있어도 타계정 버킷에 접근할 수 없습니다.

참고

"Principal": "*"을 지정하면 모든 요청 주체에 정책이 적용되므로 버킷 또는 오브젝트가 외부에 공개될 수 있습니다. 공개 범위를 확인한 후 사용해 주십시오. "nrn:PUB:Account::*"와 같이 NRN의 일부를 와일드카드로 지정할 수 없습니다.

Action

허용하거나 거부할 작업을 지정합니다. 예를 들어 오브젝트 조회 권한은 다음과 같이 설정합니다.

"Action": "View/GetObject"

여러 작업을 한 번에 지정하려면 View/*, Change/*, * 등의 와일드카드를 사용할 수 있습니다. 지원하는 Action은 사용자 정의 정책을 참조해 주십시오.

Resource

정책을 적용할 버킷 또는 오브젝트를 NRN으로 지정합니다.

버킷:

nrn:PUB:NcloudStorage:KR:{accountNo}:Bucket/{bucketId}

버킷의 모든 오브젝트:

nrn:PUB:NcloudStorage:KR:{accountNo}:Bucket/{bucketId}/*

특정 접두사(prefix):

nrn:PUB:NcloudStorage:KR:{accountNo}:Bucket/{bucketId}/logs/*
참고

버킷 정책의 Resource에는 정책을 설정하는 현재 버킷과 해당 버킷에 속한 오브젝트만 지정할 수 있습니다. 다른 버킷의 NRN을 지정하면 정책을 저장할 수 없습니다.

Condition

Condition은 특정 조건을 만족하는 요청에만 정책을 적용할 때 사용합니다. Condition은 연산자(Operator), 조건 키(Condition Key), 조건 값으로 구성됩니다.

예를 들어 특정 IP 대역에서 요청한 경우에만 오브젝트 조회를 허용할 수 있습니다.

"Condition": {
  "IpAddress": {
    "aws:SourceIp": "203.0.113.0/24"
  }
}

Condition 지원 범위

Ncloud Storage 버킷 정책에서 지원하는 연산자와 조건 키는 다음과 같습니다. 지원하지 않는 항목을 사용하면 정책 저장 시 오류가 발생할 수 있으므로, 지원 범위를 확인한 후 설정해 주십시오.

지원 연산자

연산자 용도
IpAddress
NotIpAddress
IP 주소, CIDR 대역 비교
StringEquals 문자열 완전 일치
StringLike 와일드카드(*)를 포함한 문자열 비교
Bool 참·거짓 비교
  • 각 연산자에 IfExists 추가 가능
    • 예시: StringEqualsIfExists
    • 요청에 해당 Condition Key가 없는 경우에도 조건을 만족한 것으로 평가

지원 조건 키

조건 키 사용 가능 연산자 설명
aws:SourceIp IpAddress
NotIpAddress
요청이 출발한 IP 주소
aws:SecureTransport Bool HTTPS 요청 여부
aws:Referer StringEquals
StringLike
요청을 보낸 페이지의 Referer 헤더
s3:prefix StringEquals
StringLike
목록 조회 요청의 접두사 (목록 조회 전용)
s3:delimiter StringEquals
StringLike
목록 조회 요청의 구분자 (목록 조회 전용)
ncp:principalType StringEquals 요청 주체의 종류
  • MainAccount
  • IamUser
  • IamRole
  • Anonymous
ncp:principalAccount StringEquals 요청 주체가 속한 계정의 회원번호
주의

Condition 값에 ${...} 형식의 정책 변수(Policy Variable)를 사용하지 마십시오. Ncloud Storage는 정책 변수를 지원하지 않습니다. 정책 변수는 정책에 저장될 수 있지만 실제 요청 평가 시 변수로 처리되지 않고 문자열 그대로 평가됩니다.

이로 인해 Allow Statement에서는 요청이 거부되거나, Deny Statement에서는 의도한 접근 차단이 적용되지 않을 수 있습니다. Condition에는 정책 변수를 사용하지 말고 실제 비교할 값을 직접 입력해 주십시오.

aws:SourceIp 조건을 쓸 수 없는 경우

aws:SourceIp 조건은 정책 평가 시점에 버킷 정책에 실제로 도달하는 출발지 주소를 기준으로 판정됩니다. 이 주소가 최종 사용자의 실제 접속 IP와 다른 경우가 있어, 아래 두 가지 경로에서는 이 조건을 최종 사용자 IP 기준으로 사용할 수 없습니다.

요청 경로 버킷 정책에 도달하는 출발지 주소
Public Endpoint로 직접 요청 최종 사용자의 실제 공인 IP
VPC(Private Endpoint)로 요청 100.64.0.0/10 대역으로 변환된 주소
CDN 등 중계 서버를 경유한 요청 중계 서버(CDN)의 IP
  • VPC(사설 도메인)로 들어온 요청은 출발지 주소가 100.64.0.0/10 대역으로 변환되어 정책에 도달합니다. 고객이 자신의 서버·사무실 IP 대역을 조건에 그대로 입력하면, 의도와 반대로 본인의 요청이 차단될 수 있습니다.
  • CDN 등 중계 서버를 거친 요청은 최종 사용자가 아니라 중계 서버의 IP로 판정됩니다.
주의

두 경우 모두 최종 사용자의 실제 접속 IP를 기준으로 접근을 제어하려는 목적이라면 aws:SourceIp 조건을 사용할 수 없습니다. VPC(Private Endpoint) CDN을 경유하는 트래픽이 있다면, aws:SourceIp 조건을 적용하기 전에 실제로 정책에 도달하는 출발지 주소가 무엇인지 먼저 확인해 주십시오.

제외 조건 지정

NotPrincipal, NotAction, NotResource는 지정한 대상을 제외한 나머지 범위에 정책을 적용할 때 사용합니다. 일반적인 Principal, Action, Resource와 적용 범위가 다르므로 사용 시 주의해 주십시오.

입력 동작
NotPrincipal에 계정 주체(Customer/static) 지정 해당 계정의 메인 계정만 예외. 같은 계정의 서브 계정, 역할은 예외가 아니며 거부문이 그대로 적용됨
NotPrincipal에 특정 서브 계정을 지정 해당 서브 계정만 예외
NotPrincipal을 Allow 문에 사용 400 MalformedPolicy — Deny 문에서만 사용 가능
NotAction에 존재하지 않는 액션명 지정 NotAction은 입력한 값이 유효한 Action인지 검증하지 않음. 존재하지 않는 Action을 지정하면 실제로 제외되는 Action이 없어 해당 Statement가 모든 Action에 적용될 수 있음
NotAction에 전체를 덮는 값을 지정 400 MalformedPolicy
NotResource에 전체를 덮는 값을 지정 정책 저장 가능(204)
주의

NotAction과 NotResource에 입력한 값은 정책 저장 시 일부 유효성 검사가 적용되지 않을 수 있으므로, 정책이 정상 저장되더라도 설정한 제외 조건이 의도대로 적용되는지 확인해야 합니다.
NotAction에 *를 지정하면 정책 저장 시 오류가 발생하지만, NotResource에 "*"를 지정하면 정책이 저장될 수 있습니다. 따라서 정책 저장 성공 여부만으로 정책이 올바른지 판단하지 말고 입력한 값을 반드시 확인해 주십시오.

참고

NRN(Ncloud Resource Name)은 네이버 클라우드 플랫폼 내의 모든 리소스를 표현하기 위한 명명 규칙입니다. NRN은 Management & Governance > Resource Manager > Resource 메뉴에서 해당 리소스를 클릭하면 상세 정보에서 확인할 수 있습니다. 자세한 내용은 Resource 가이드를 참조해 주십시오.

공개 정책 판정

Principal이 "*"인 Allow 문이 있다고 해서 정책이 항상 공개로 판정되는 것은 아닙니다. Condition이 요청자를 충분히 특정하는 경우에는 공개로 보지 않습니다.

요청자를 특정하는 것으로 인정되는 조건 키는 아래와 같습니다.

  • aws:SourceIp
  • ncp:principalAccount

이 외의 조건 키(aws:Referer, ncp:principalType, s3:prefix 등)는 조건을 걸어도 요청자를 특정하는 것으로 인정되지 않으므로 해당 조건만 있는 Allow 문은 여전히 공개로 분류됩니다.

주의

정책 안에 공개로 판정되는 Statement가 하나라도 있으면, 나머지 Statement가 모두 비공개 조건을 갖추고 있어도 정책 전체가 퍼블릭 정책으로 분류됩니다.

퍼블릭 액세스 차단의 BlockPublicPolicy가 켜진 버킷(신규 생성 버킷의 기본값)에서는 이렇게 판정된 퍼블릭 정책의 신규 저장 및 변경 요청이 403 AccessDenied로 거부됩니다. 단, 이미 저장된 공개 정책은 BlockPublicPolicy를 활성화하더라도 유지되며, 해당 정책에 따른 외부 접근이 계속 허용될 수 있습니다. 기존 공개 정책을 통한 외부 접근을 제한하려면 RestrictPublicBuckets를 활성화해야 합니다.

정책 저장이 거부된다면 Principal: "*" 문에 aws:SourceIp 또는 ncp:principalAccount 조건이 걸려 있는지 확인해 주십시오.

참고

정책의 공개 여부는 Allow 문을 기준으로 판단하되, 동일한 리소스 및 작업 범위에 조건 없는 Deny 문이 적용되는 경우에는 해당 Allow 문으로 인한 공개 접근이 차단되어 비공개 정책으로 판정될 수 있습니다.

익명 요청 차단 방법

로그인하지 않은 사용자의 익명 요청을 차단하려면 버킷 정책에서 ncp:principalType 조건 키를 사용하거나, Principal을 기준으로 접근을 제어할 수 있습니다.

익명 요청은 사용하는 조건 키에 따라 처리 방식이 다르므로 다음 사항에 유의해 주십시오.

  • ncp:principalAccount: 익명 요청에는 해당 조건 키의 값이 존재하지 않습니다. 따라서 이 키를 기준으로 설정한 Deny 정책은 익명 요청에 적용되지 않습니다.
  • ncp:principalType: 익명 요청에도 Anonymous 값이 존재합니다. 따라서 해당 조건 키를 사용하면 익명 요청만 선택적으로 차단할 수 있습니다.

익명 요청 차단 예시

다음은 ncp:principalType 조건 키를 사용하여 익명 사용자의 객체 조회 요청을 차단하는 버킷 정책 예시입니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyAnonymousAccess",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*",
      "Condition": {
        "StringEquals": {
          "ncp:principalType": "Anonymous"
        }
      }
    }
  ]
}
주의

ncp:principalAccount를 사용한 Deny 정책으로는 익명 요청을 차단할 수 없습니다.
익명 요청만 차단하려면 위 예시와 같이 ncp:principalType을 Anonymous로 설정하거나, Principal을 기준으로 차단 대상을 직접 지정해 주십시오.

권한 판정 방식

Ncloud Storage는 요청자에게 부여된 계정 권한(Sub Account)과 버킷 정책을 함께 평가하여 최종 접근 권한을 결정합니다. 요청자 유형에 따라 두 권한의 결합 방식이 다릅니다.

요청자 결합 방식 설명
같은 계정 계정 권한 또는 버킷 정책 계정 권한 또는 버킷 정책 중 하나에서 명시적으로 허용하면 요청이 허용됨
다른 계정 계정 권한 그리고 버킷 정책 요청자 계정의 권한과 버킷 정책에서 모두 명시적으로 허용해야 요청이 허용됨
익명 버킷 정책만 Principal: "*" 등으로 익명 요청을 명시적으로 허용해야 요청이 허용됨

판정 결과는 세 가지 상태로 구분되며, 우선순위는 명시적 거부 > 명시적 허용 > 암묵적 거부입니다. 명시적 Deny가 있는 경우 다른 정책의 Allow보다 항상 우선하여 요청이 거부됩니다.

계정 권한 버킷 정책 같은 계정 다른 계정 익명
허용 허용 허용 허용 허용
허용 암묵적 거부 허용 거부 거부
허용 명시적 거부 거부 거부 거부
암묵적 거부 허용 허용 거부 허용
명시적 거부 허용 거부 거부 허용
주의

버킷 소유 계정을 대상으로 Deny 정책을 설정하면 해당 버킷의 데이터 요청이 차단될 수 있습니다. 메인 계정은 버킷 정책을 조회·수정·삭제하여 정책을 복구할 수 있습니다. 반면 서브 계정은 차단 정책의 적용을 받으므로 정책 관리 작업까지 차단된 경우 직접 복구할 수 없습니다.

버킷 소유 계정을 대상으로 Deny 정책을 설정할 때는 정책 관리 권한이 차단되지 않도록 적용 범위를 반드시 확인해 주십시오.

참고
  • 객체 복사(CopyObject)처럼 두 개의 버킷을 사용하는 요청은 원본 버킷과 대상 버킷의 정책을 각각 판정합니다. 한쪽만 허용되어 있으면 요청이 거부됩니다.
  • 웹 호스팅 주소로 들어온 요청은 서명 유무와 관계없이 항상 익명으로 판정합니다. 버킷 정책이 열어 준 범위만 응답합니다.
  • 콘솔 요청은 콘솔에 로그인한 사용자를 기준으로 판정합니다. 메인 계정·서브 계정·역할 전환 로그인 모두 각각의 주체로 평가되므로, 같은 정책이면 콘솔과 API의 판정 결과가 동일합니다.
  • 버킷 정책의 Allow는 요청 주체(Principal), 작업(Action), 리소스(Resource) 및 조건(Condition)에 일치하는 경우에만 적용됩니다. 익명 요청은 해당 요청을 허용하는 버킷 정책이 있어야 접근 가능하며, 명시적인 Deny 또는 퍼블릭 액세스 차단 설정에 따라 접근이 거부될 수 있습니다.

정책 예시

시나리오별 버킷 정책 예제입니다. {계정번호}, {버킷ID}, {서브계정ID}, {역할ID}는 실제 값으로 바꿔서 사용해 주십시오.

특정 접두사만 퍼블릭 읽기 허용

버킷의 public/ 하위 객체만 누구나 조회할 수 있도록 허용합니다. 정적 파일 서빙이나 웹 호스팅에 사용하는 가장 기본적인 정책입니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadPublicPrefix",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{bucketId}/public/*"
    }
  ]
}
참고

이 정책을 저장하려면 퍼블릭 액세스 차단의 BlockPublicPolicy를 먼저 해제해야 합니다.

버킷 전체 퍼블릭 읽기 허용

버킷에 저장된 모든 객체를 공개합니다. 목록 조회까지 허용하려면 버킷 레벨 Action과 버킷 리소스를 함께 지정해야 합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicListBucket",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "View/ListBucket",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}"
    },
    {
      "Sid": "PublicGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*"
    }
  ]
}

다른 계정에 읽기 권한 위임

다른 계정({상대계정번호})의 모든 주체에게 버킷 목록 조회와 객체 조회 권한을 부여합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CrossAccountRead",
      "Effect": "Allow",
      "Principal": {
        "NCP": "nrn:PUB:Account::{상대계정번호}:Customer/static"
      },
      "Action": "View/ListBucket",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}"
    },
    {
      "Sid": "CrossAccountGetObject",
      "Effect": "Allow",
      "Principal": {
        "NCP": "nrn:PUB:Account::{상대계정번호}:Customer/static"
      },
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*"
    }
  ]
}

특정 서브 계정에만 업로드 허용

지정한 서브 계정에만 upload/ 접두사 하위에 객체를 업로드할 수 있는 권한을 부여합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowUploadForSubAccount",
      "Effect": "Allow",
      "Principal": {
        "NCP": "nrn:PUB:IAM::{계정번호}:SubAccount/{서브계정ID}"
      },
      "Action": "Change/PutObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/upload/*"
    }
  ]
}

여러 주체에 동시에 권한 부여

서브 계정과 역할을 배열로 함께 지정합니다. 하나라도 일치하면 매칭됩니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowMultiplePrincipals",
      "Effect": "Allow",
      "Principal": {
        "NCP": [
          "nrn:PUB:IAM::{계정번호}:SubAccount/{서브계정ID}",
          "nrn:PUB:IAM::{계정번호}:Role/{역할ID}"
        ]
      },
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*"
    }
  ]
}

지정한 주체 외 모든 접근 거부

NotPrincipal로 예외를 지정하고 나머지 모든 주체를 거부합니다. NotPrincipal은 Deny 문에서만 사용할 수 있으며, 계정 주체(Customer/static)를 지정하면 메인 계정만 예외가 되고 같은 계정의 서브 계정과 역할은 거부 대상에 포함됩니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyExceptAllowedSubAccount",
      "Effect": "Deny",
      "NotPrincipal": {
        "NCP": "nrn:PUB:IAM::{계정번호}:SubAccount/{서브계정ID}"
      },
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*"
    }
  ]
}

객체 삭제 금지

계정 권한으로 삭제가 허용된 주체라도 버킷 차원에서 삭제를 차단합니다. 명시적 거부는 모든 허용보다 우선하며 버킷 소유 계정에도 적용되므로, 자신을 차단한 경우 정책을 삭제하거나 수정해 복구해야 합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyDelete",
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
        "Change/DeleteObject",
        "Change/DeleteObjectVersion"
      ],
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*"
    }
  ]
}

읽기 전용 위임

지정한 서브 계정에 객체 조회만 허용하고, 변경 계열 작업 전체를 명시적으로 거부합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowRead",
      "Effect": "Allow",
      "Principal": {
        "NCP": "nrn:PUB:IAM::{계정번호}:SubAccount/{서브계정ID}"
      },
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*"
    },
    {
      "Sid": "DenyWrite",
      "Effect": "Deny",
      "Principal": {
        "NCP": "nrn:PUB:IAM::{계정번호}:SubAccount/{서브계정ID}"
      },
      "Action": "Change/*",
      "Resource": [
        "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}",
        "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*"
      ]
    }
  ]
}

조건 키 예제

조건(Condition)을 사용하면 정책이 적용되는 범위를 좁힐 수 있습니다. 한 문장에 여러 조건을 지정하면 모든 조건을 충족해야 매칭되며, 하나의 조건 키에 여러 값을 배열로 지정하면 하나라도 일치하면 충족한 것으로 판정합니다. 조건 연산자 이름은 대소문자를 구분하므로 stringequals처럼 입력하면 400 MalformedPolicy로 거부됩니다.

특정 IP 대역에서만 허용

지정한 IP 대역에서 온 요청만 객체를 조회할 수 있도록 허용합니다. IP 주소는 CIDR 표기로 입력하며, 192.000.002.008처럼 앞에 0을 채운 느슨한 표기는 거부됩니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowFromOfficeIp",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": ["192.0.2.0/24", "198.51.100.10/32"]
        }
      }
    }
  ]
}

특정 IP 대역 외 모든 요청 거부

허용 목록 방식보다 강력하게 제한합니다. 명시적 거부는 모든 허용보다 우선하므로, 계정 권한이 있는 주체와 버킷 소유 계정도 지정한 대역 밖에서는 접근할 수 없습니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyOutsideOfficeIp",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": "192.0.2.0/24"
        }
      }
    }
  ]
}

HTTPS 요청만 허용

평문 HTTP로 들어온 요청을 거부해 전송 구간 암호화를 강제합니다. 웹 호스팅 엔드포인트는 HTTP만 지원하므로 일반 API 엔드포인트에서만 유효합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyInsecureTransport",
      "Effect": "Deny",
      "Principal": "*",
      "Action": ["View/GetObject", "Change/PutObject"],
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*",
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      }
    }
  ]
}

지정한 도메인에서만 참조 허용

공개한 이미지나 정적 파일이 다른 사이트에서 직접 참조되는 것을 방지합니다. Referer 헤더는 요청을 보내는 쪽이 자유롭게 지정할 수 있는 값이므로, 접근 통제 수단이 아니라 핫링크 방지 용도로만 사용해 주십시오.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowOnlyMySite",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/assets/*",
      "Condition": {
        "StringLike": {
          "aws:Referer": [
            "https://www.example.com/*",
            "https://example.com/*"
          ]
        }
      }
    }
  ]
}
참고

이 정책을 저장하려면 퍼블릭 액세스 차단의 BlockPublicPolicy를 먼저 해제해야 합니다.

특정 접두사의 목록만 조회 허용

s3:prefix와 s3:delimiter로 목록 조회 범위를 특정 폴더로 한정합니다. 두 조건 키는 목록 조회 요청에만 사용할 수 있으며, 객체 조회에 지정하면 400 MalformedPolicy로 거부됩니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowListDocsPrefixOnly",
      "Effect": "Allow",
      "Principal": {
        "NCP": "nrn:PUB:IAM::{계정번호}:SubAccount/{서브계정ID}"
      },
      "Action": "View/ListBucket",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}",
      "Condition": {
        "StringLike": {
          "s3:prefix": "docs/*"
        },
        "StringEquals": {
          "s3:delimiter": "/"
        }
      }
    }
  ]
}

내 계정의 주체만 허용

ncp:principalAccount로 요청 주체가 속한 계정을 확인하여, 지정한 계정에 해당 Allow 정책이 적용되도록 설정할 수 있습니다. 단, 다른 정책에서 이미 허용한 접근 권한을 취소하거나 거부하지는 않습니다. 따라서 다른 계정에 동일한 객체에 대한 조회 권한이 별도로 부여되어 있다면 해당 계정의 접근은 계속 허용될 수 있습니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowMyAccountOnly",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*",
      "Condition": {
        "StringEquals": {
          "ncp:principalAccount": "{계정번호}"
        }
      }
    }
  ]
}

주체 종류로 구분

ncp:principalType은 요청 주체가 메인 계정, 서브 계정, 역할 중 어떤 유형에 해당하는지 구분하는 조건 키입니다. 콘솔 로그인 시 요청 주체의 유형은 로그인 유형에 따라 결정됩니다.
다만 ncp:principalType은 특정 계정을 식별하는 조건이 아니므로, 공개 여부 판정 시 접근 대상을 특정하는 조건으로 인정되지 않습니다. 따라서 모든 사용자(Principal: "*")를 대상으로 허용(Allow)하는 정책에 ncp:principalType 조건을 추가하더라도 공개 정책으로 분류됩니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowRoleOnly",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*",
      "Condition": {
        "StringEquals": {
          "ncp:principalType": "IamRole"
        }
      }
    }
  ]
}
참고

이 정책을 저장하려면 퍼블릭 액세스 차단의 BlockPublicPolicy를 먼저 해제해야 합니다.

값이 있을 때만 비교

연산자 뒤에 IfExists를 붙이면 요청에 해당 값이 없을 때 조건을 충족한 것으로 판정합니다. Referer가 없는 요청까지 함께 차단하지 않으려는 경우에 사용합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowWhenRefererMatchesOrAbsent",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/assets/*",
      "Condition": {
        "StringLikeIfExists": {
          "aws:Referer": "https://www.example.com/*"
        }
      }
    }
  ]
}
참고

이 정책을 저장하려면 퍼블릭 액세스 차단의 BlockPublicPolicy를 먼저 해제해야 합니다.

조건 여러 개를 함께 사용

한 문장에 여러 조건을 지정하면 모두 충족해야 매칭됩니다. 아래 정책은 지정한 IP 대역에서 HTTPS로 들어온 요청만 허용합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowSecureFromOffice",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "View/GetObject",
      "Resource": "nrn:PUB:NcloudStorage:KR:{계정번호}:Bucket/{버킷ID}/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "192.0.2.0/24"
        },
        "Bool": {
          "aws:SecureTransport": "true"
        }
      }
    }
  ]
}

조건 키 입력 오류

지원하지 않는 조건 키나 연산자를 입력하면 저장 단계에서 거부됩니다. 입력한 이름에 따라 반환되는 오류가 다릅니다.

입력한 이름 오류 코드 메시지
지원하지 않는 연산자 (StringNotEquals, Null, Numeric*, Date*) NotImplemented Condition operator is not implemented in bucket policy
이름은 있으나 아직 평가하지 않는 조건 키 (aws:SourceVpc, aws:CurrentTime, s3:VersionId) MalformedPolicy Condition key is not implemented in bucket policy
목록에 없는 조건 키 (오타 포함) MalformedPolicy Policy has an invalid condition key
aws:로 시작하는 신원 조건 키 (aws:PrincipalArn, aws:userid 등) MalformedPolicy Condition key is not supported in bucket policy

오류 응답의 Detail 항목에는 문제가 된 이름이 입력한 그대로 표시됩니다. 대신 사용할 ncp: 이름이 이미 지원되는 경우에는 메시지로 함께 안내합니다.

퍼블릭 액세스 차단

퍼블릭 액세스 차단 기능을 통해 버킷이 인터넷에 공개되지 않도록 보호할 수 있습니다. 공개 버킷 정책의 생성 및 적용을 제한하여 의도하지 않은 공개를 방지합니다. 퍼블릭 액세스 차단을 해제하더라도, 버킷이 자동으로 공개되지는 않으며 버킷을 공개하려면 버킷 정책 기능을 통해 별도의 정책을 설정해야 합니다. 퍼블릭 액세스 차단을 설정하는 방법은 다음과 같습니다.

  1. 버킷 목록에서 버킷을 선택한 후 퍼블릭 액세스 차단 영역의 i-objectstorage_enlargement를 클릭해 주십시오.
  2. 퍼블릭 액세스 설정 팝업 창에서 퍼블릭 액세스 차단 설정을 활성화해 주십시오.
    • 퍼블릭 액세스 차단 설정을 활성화하면 세부 설정 항목이 모두 적용됨
  3. 특정 설정 항목만 활성화하려면 퍼블릭 액세스 차단 설정을 비활성화한 후 원하는 항목을 선택해 주십시오.
    • 공개 버킷 정책 생성 차단(BlockPublicPolicy): 공개 버킷 정책의 저장 차단
    • 공개 버킷 정책 접근 제한(RestrictPublicBuckets): 저장된 공개 버킷 정책의 적용 제한
  4. 설정 내용을 확인한 후 [확인] 버튼을 클릭해 주십시오.
참고

퍼블릭 액세스 차단이 설정된 경우 다음 사항에 유의해 주십시오.

  • BlockPublicPolicy가 활성화된 버킷에 퍼블릭 정책을 저장하면 403 Forbidden 오류가 반환됩니다.
  • RestrictPublicBuckets가 활성화된 경우 퍼블릭 정책이 저장되어 있더라도 공개 접근이 제한됩니다.
  • 버킷을 외부에 공개하려면 두 설정을 모두 해제하고 적절한 공개 버킷 정책을 설정해야 합니다.

CORS 설정

CORS 기능을 통해 다른 도메인의 웹 애플리케이션에서 현재 버킷의 오브젝트에 접근할 수 있습니다. 리소스 요청을 허용할 출처(Origin), HTTP 메서드, 헤더 등을 설정해 접근을 제어할 수 있으며 규칙은 최대 100개까지 설정할 수 있습니다. CORS 정책을 설정하는 방법은 다음과 같습니다.

  1. 버킷 목록에서 버킷을 선택한 후 CORS 설정 영역의 i-objectstorage_enlargement를 클릭해 주십시오.
  2. CORS 설정 팝업 창에서 수정을 선택해 주십시오.
  3. CORS 정책 수정 팝업 창에 JSON 형식으로 작성한 정책을 입력한 후 [확인] 버튼을 클릭해 주십시오.
  4. CORS 설정 팝업 창에서 작성된 내용을 확인한 후 [확인] 버튼을 클릭해 주십시오.
    • CORS 설정 팝업에서 [확인] 버튼을 클릭하지 않으면 작성된 정책이 적용되지 않습니다.

CORS 구성 요소

CORS 구성 요소는 다음과 같습니다.

키 필수 여부 설명 상세 내용
AllowedMethods Required 허용할 HTTP 메서드 허용되는 값
  • GET
  • PUT
  • POST
  • DELETE
  • HEAD
AllowedOrigins Required 접근을 허용할 웹사이트의 Origin 목록
  • 최대 1개의 * 허용
  • 지원하는 패턴
    • *: 모든 Origin 허용
    • *.example.com: 서브도메인 와일드카드
    • www.example*.com: 중간 위치 와일드카드
    • www.example.*: TLD 와일드카드
AllowedHeaders Optional 브라우저 요청 시 허용할 HTTP 헤더 목록
  • 최대 1개의 * 허용(위치 제한 없음)
  • 지원하는 패턴
    • *: 모든 헤더 허용
    • x-amz-*: 접두사 와일드카드
      • 예: x-amz-date, x-amz-content-sha256
    • *-header: 접미사 와일드카드
    • x-*-header: 중간 위치 와일드카드
  • 대소문자를 구분하지 않음
  • 입력값의 앞뒤 공백은 자동으로 제거됨
  • 헤더 이름 규칙(RFC 7230)
    • 허용 문자
      • a-z A-Z 0-9 ! # $ % & ' * + - . ^ _ ~
    • 다음 문자가 포함된 경우 허용되지 않음
      • @ ( ) { } [ ] / : ; = ? " \ 공백 등 비 tchar 문자
    • 헤더 이름 중간에 공백이 포함된 경우는 허용되지 않음 (예: x amz date)
ExposeHeaders Optional 브라우저에 접근할 수 있도록 허용할 응답 헤더 목록
  • 와일드카드 지원 안 함
  • 대소문자를 구분하지 않음
  • 입력값의 앞뒤 공백은 자동으로 제거됨
  • 헤더 이름 규칙(RFC 7230)
    • 허용 문자
      • a-z A-Z 0-9 ! # $ % & ' * + - . ^ _ ~
    • 다음 문자가 포함된 경우 허용되지 않음
      • @ ( ) { } [ ] / : ; = ? " \ 공백 등 비 tchar 문자
    • 헤더 이름 중간에 공백이 포함된 경우는 허용되지 않음 (예: x amz date)
MaxAgeSeconds Optional 브라우저가 요청 결과를 캐시하는 시간(초) 값이 0인 경우 캐시하지 않으며, 요청 시마다 Preflight 요청이 수행됨