문제점 발생
Rookies 개발 2기의 두 번째 프로젝트를 진행하는 과정에서 문제가 발생하였다.
우리의 프로젝트는 간단히 설명하자면 기업용 메신저 애플리케이션이다.
사진과 파일처리는 DB를 쓰지 않고 AWS에서 제공하는 S3를 통해 제공하고자 하였다.
다만 이 과정에서 문제가 발생하였다.
이런 식으로 채팅창을 만들고 사진을 보내면 내 어플리케이션에는 이런식으로 사진이 뜨지만 상대방 화면에서는 뜨지 않는 게 확인되었다. 한 개의 계정으로만 개발하고 테스트하여 나중에 확인된 문제였다.
의심 과정
첫 번째 의심: S3 업로드 오류
먼저 사진이 정상적으로 업로드되지 않았나? 를 의심하며 접속하여 확인하게 되었다.
예시로 보낸 사진이며 해당 객체 URL을 받아 상대방의 애플리케이션에도 뿌려주게 되는 구조이다.
여기서 오른쪽 상단 3번째 버튼인 열기를 누르면
정상적으로 사진이 보이지만
아래 객체 URL을 누르면
아래와 같이 AccessDenied가 뜨며 파일이 열리지 않게 거부되는 것을 확인하였다.
두 번째 의심 : URL이 다르다
먼저 무엇이 다른지 보게 되었다.
첫 번째 열기 버튼으로 들어간 건 두 번째 주소보다
이런 식으로 뒤에 추가적으로 `?X-Amz-Algorithm=AWS4-HMAC-SHA256&...`
처럼 암호화와 관련되어 보이는 쿼리스트링이 붙은 걸 알 수 있었다.
또한 그냥 쿼리스트링을 지우고 들어갔을 때엔
이런식으로 거부가 되는 것을 미루어 보아
이는 이 S3 버킷에 사진을 확인하기 위해선 추가적으로 보안을 건드려주어야 하는구나라고 생각하였다.
(개인적인 생각이므로 아닐 수 있음.)
그래서 버킷 설정에 권한과 관련된 부분을 찾아보았다.
세 번째 의심: Bucket 권한 설정
버킷의 권한 탭에 들어가면 여러 가지 권한 설정을 확인할 수 있다.
첫 번째 퍼블릭 액세스 차단은 애초에 S3 생성 때부터 허용하도록 설정하였으므로 PASS
아래 버킷 정책을 보면
JSON으로 작성되며 버킷에 저장된 객체에 대한 액세스 권한을 제공한다고 한다!
편집을 눌러 자세히 살펴보게 되었다.
해결 과정
버킷 정책 편집
정책 편집에 들어가게 되면 정책 예제, 정책생성기 등 JSON을 작성하는데 여러 도움을 주고 있는 것 같다.
먼저 정책 예제에 대해 들어가 보게 되었다.
Examples of Amazon S3 bucket policies - Amazon Simple Storage Service
We recommend that you use caution when using the aws:Referer condition key. It is dangerous to include a publicly known HTTP referer header value. Unauthorized parties can use modified or custom browsers to provide any aws:Referer value that they choose. T
docs.aws.amazon.com
들어가 보면 볼 수 있겠지만, 정책을 통해 MFA 인증, SSE-KMS 키,
HTTPS 주소에 대한 액세스만 차단하는 등 여러 조건들을 통해 관리할 수 있음을 알 수 있다.
하지만 내가 원하는 건 develop 단계이므로 모든 접근에 대해 허용을 원한다.
정책 생성기
이제 정책 생성기로 들어가 보자.
https://awspolicygen.s3.amazonaws.com/policygen.html
AWS Policy Generator
Click below to edit. To save the policy, copy the text below to a text editor. Changes made below will not be reflected in the policy generator tool.
awspolicygen.s3.amazonaws.com
이러한 화면이 뜰 텐데, Step 1부터 확인해 보면 어떤 타입의 정책을 생성할 것인지 묻는다.
우린 S3 Bucket에 대한 정책이 필요하므로 아래와 같이 선택한다.
다음은 Step 2이다. 모든 서비스에 대해 허용을 해주어야 하므로 Principal 에는 * 을
Actions 에는 모두를 허용해 준다.
그다음 Amazon Resource Name (ARN) 필드가 남았을 텐데, 이건 버킷 설정에 들어가 리소스 이름을 찾으면 된다.
복사 버튼 그대로 눌러서 그대로 붙여 넣기 하자.
그다음 아래 `Add Statement` 를 누르면
설정한 정책이 들어가게 되고,
Generate Policy를 눌러 생성하자.
JSON 파일이 생성되면 그대로 복붙 해보자.
문제가 생겼어
정책을 변경했음에도 변화가 없다..
무엇이 문제일까, 정책이 문제가 아니었을까? 다시 공식문서로 돌아가 살펴보게 되었다.
이런, 위 사진은 예시 파일인데 버킷에 쓰는 모든 객체에 적용하기 위해선
`"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",` 라고한다.
즉 버킷만 쓰면 버킷 자체를 가리키며 버킷에 대한 설정 변경, 버킷 정책 조회, 버킷 목록 조회 등 버킷 수준의 작업들에만 적용된다는 것이다!
`/*` 를 추가하게 되면 객체 업로드, 다운로드, 삭제 등 객체 수준의 작업에 적용되며 이렇게 해야지 객체에 권한을 허용할 수 있다.
{
"Version": "2012-10-17",
"Id": "Policy1740070874145",
"Statement": [
{
"Sid": "Stmt1740070868443",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::your-bucket/*"
}
]
}
자 다시 이렇게 수정하고 확인해 보자.
이제 객체 URL을 통해서도 액세스 거부 없이 확인할 수 있게 되었으며
이렇게 같은 사진이 넘어오게 되었다!
(배경색이 다른 건 메시지 풍선 색상 때문이다. 사진은 배경이 없는 버전.)
마무리
해당 문제를 해결하며 처음 한 것은 최대한 공식문서를 통해서 해결하고자 하였다. 일반 블로그나 Chat gpt 등 많은 정보를 주고 있지만, 배우는 입장에서. 그것도 처음 접하는 문제이기 때문에 확실하게 해결하고 싶었다. 어떻게 보면 간단한 문제이지만 시간이 걸리더라도 이러한 과정을 통해 AWS S3에 대해 보안과 권한에 대한 더 깊은 이해를 할 수 있었다.
추가적으로 개발 이후엔 모두 보안처리 완료하였다.
'SK 루키즈 > Cloud' 카테고리의 다른 글
[Rookies 개발 2기] Nginx 404 에러 해결 (0) | 2025.02.25 |
---|---|
[Rookies 개발 2기] Docker를 통해 Kafka 연결하기 (2) | 2025.02.06 |
[Rookies 개발 2기] AWS 서버리스 개념과 ECS와 Lambda (0) | 2025.01.24 |
[Rookies 개발 2기] MSA와 EurekaServer 세팅 (0) | 2025.01.24 |
[Rookies 개발 2기] AWS S3 에 Spring 업로드 처리 (0) | 2025.01.23 |