IAM 정책은 JSON 형식으로 작성됩니다. 예를 들어 아래처럼 말이죠.
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity AH1E638GJWX649"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::ctp102.test/*"
}
]
}
위의 정책을 해석하기 위해서는 IAM-Policy 정책 2가지에 대해 알고 있어야 쉽게 해석할 수 있습니다. (위 JSON은 리소스-기반 정책)
IAM-Policy 정책은 자격증명-기반 정책과 리소스-기반 정책이 있습니다.
자격증명-기반 정책(Id-Based Policy)
자격증명-기반 정책을 사용할 때는 Principal key에 해당 정책에 연결된 보안 주체가 암묵적으로 연결됩니다.
여기서 보안 주체란 IAM 사용자, IAM 그룹, 역할, 인증된 사용자 등을 의미합니다.
자격증명-기반 정책 JSON은 '이 정책과 연결된 보안 주체(principal)는 어떤 대상(resource)에 대해 ~~한(action) 권한이 부여된다.'라고 해석하시면 됩니다.
위 예시로는 Principal에 ARN(arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity AH1E638GJWX649)이 명시되어 있습니다.
따라서 Principal이 표시되어 있는 것으로 보아 자격증명-기반 정책이 아닌 것을 확인할 수 있습니다.
리소스-기반 정책(Resource-Based Policy)
리소스-기반 정책은 Prinicpal key를 명시해야 합니다.
JSON을 해석할 때는 '이 대상(resource)에 대해 ~~한(action) 권한이 누구(principal)에게 부여된다'로 하면 됩니다.
위 JSON 예시를 해석해보자면 아래와 같습니다.
'ctp102.test에 업로드 된 모든 Object(이미지, 파일 등)에 대해 읽을 권한(s3:GetObject)이 CloudFront Origin Access Identity AH1E638GJWX649에게 부여된다'
즉, CloudFront를 거쳐야만 S3 오브젝트에 접근이 가능하다는 의미입니다.