S3를 사용하여 Spring boot 내 이미지 POST, GET API를 설정하는 과정.
**S3는 쉬우면서도 어려운 서비스이다.-우테코(S3보안가이드)**
간단하게 사용하기엔 쉬운 서비스지만, 제대로 이해하고 사용하기엔 무척이나 복잡하다.
쉬운 설명(약간 국룰 코드인듯 하다.)
[SPRING] [AWS] 게시글 이미지 업로드 하기 (1) - S3 설정하기
HTTP requset body에 multipart/form-data가 포함되는 경우
주의 AmazonS3Client (자료)
POST profile 코드
@Operation(summary = "회원가입 시 프로필 생성 메소드(S3 업로드)", description = "회원가입 시 프로필을 생성하는 메소드입니다. req 형식은 multipart/form-data 입니다. 입력은 JWT 계정과 알맞은 userID가 반드시 URI에 포함되어야 하며, 아닐경우 null을 반환합니다. 헤더 내 Authorization:Bearer ~ 형태의 JWT 토큰을 필요로 합니다.")
@PostMapping(value="/s3/profile/{id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) // swagger를 위해 변형을 줌
public PostProfileResponse create(
@PathVariable("id") Long userId,
@AuthenticationPrincipal UserPrincipal principal,
@RequestPart(value = "nickname") String nickname,
@RequestPart(value = "profileImg", required = false) MultipartFile multipartFile
) {
if(principal == null)
return null;
if(principal.getUserId() != userId) {
System.out.println("your ID is"+principal.getUserId());
return null; //response 헤더에서 에러처리 필요.
}
System.out.println(principal.getEmail());
System.out.println(principal.getEmail());
String imageLink = s3Service.putS3Test(multipartFile);
userService.updateProfile(userId, imageLink, nickname);
return null;
}
Access Denied
Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: E8MKZ4ZGCJ5015YX; S3 Extended Request ID: P5daKsMi310vDONP7vmV6Q0zxk32TguDdNNr+PFkwO7ri/Gnmj0/Wym9o3RK+VNE30fpKZLJtNo=; Proxy: null)

The bucket does not allow ACLs
The bucket does not allow ACLs (Service: Amazon S3; Status Code: 400; Error Code: AccessControlListNotSupported; Request ID: 6QAPVQ8HBKMV6P1S; S3 Extended Request ID: nbA7yrhNIl1bXSwlHRN4baLHwcMFphg1eC3OLsJhWW62IX+bK4b/XcWZynb4iormhG2vMY73oLw=; Proxy: null)

일단 성공
it's running
images/channels4_profile.jpg
2024-05-01T22:53:40.383+09:00 INFO 3480 --- [swip] [nio-8080-exec-4] com.example.swip.config.s3.S3Uploader : 파일이 삭제되었습니다.
fileName = <https://swyp-bukkit.s3.ap-northeast-2.amazonaws.com/images/channels4_profile.jpg>
하지만 아무래도, 모든 액세스 방식을 열어둔 것은 무척 불안하다.
Get방식에 대한 제어가 불가능할 뿐더러, put 방식도 어떻게 이루어지는지 알 수 없다.
버킷 정책이 도대체 어떤 역할을 하는지 알아보고,
버킷 정책 건들여보기
아마 arn:aws:iam::{계정 ID}:root는 arn:aws:iam::{계정 ID}:user/swyp의 상위 권한인 것 같다.