springboot에서 이미지를 업로드하는 메서드는 만들었지만, 삭제하는 메서드는 만들지 않아서 만들어 보았다.
//S3 파일 삭제 메서드
public String deleteFile(String uploadFilePath, String imgUrl) {
String result = "success";
// 문자열에서 "static/profile/" 다음의 부분을 추출
try {
String keyName = uploadFilePath+extractString(imgUrl, uploadFilePath); // ex) uploadPath (static/profile) + uuid.확장자
System.out.println(keyName);
boolean isObjectExist = amazonS3Client.doesObjectExist(bucket, keyName);
if (isObjectExist) {
amazonS3Client.deleteObject(bucket, keyName);
} else {
result = "file not found";
}
} catch (Exception e) {
log.debug("Delete File failed", e);
}
return result;
}
private static String extractString(String input, String marker) {
int startIndex = input.indexOf(marker);
if (startIndex != -1) {
// marker 다음의 부분을 추출
return input.substring(startIndex + marker.length());
} else {
// marker가 없으면 빈 문자열 반환
return "";
}
}
key 값은 S3 페이지에서 볼 수 있드시, S3 내에서의 경로 + uuid.확장자 형태이다.
하지만, 오류가 발생했다. 아래의 오류를 보면 권한 오류라고 해석할 수 있다.
Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; ... )
S3에서 정책을 확인해보니,
사진에서 볼 수 있드시, 버킷의 소유자를 제외하고, 읽기만 이용 할 수 있는 형태이다.
문제가 없다.
분명 IAM에서 권한을 줄 때 AmazonS3FullAccess
를 부여했는데, 읽기는 되지만 쓰기가 되지 않았다. 그래서 IAM 사용자 계정에 들어와서 권한
을 확인하였다.
아래에 AWSCompromisedKeyQuarantineV2
라는 새로운 권한이 추가되어 있었다. 이게 뭐지하고 검색했는데, github에 실수로 aws access key가 노출되었을 때 생성된 정책이다.. 안에 들어가보면 이로 인해 제한된 정책의 정보들을 볼 수 있다.
AWS의 지시사항 (메일이 왔었음)
Step 1: Rotate and delete the exposed AWS Access Key
Step 2: Check your CloudTrail log for unsanctioned activity.
Step 3: Review your AWS account for any unauthorized AWS usage.
Step 4: [IMPORTANT] You must respond to the existing Support Case or create a new one to confirm completion of the steps above in order to restore access to your account, prevent suspension, and apply for a billing adjustment, if applicable.
노출된 key를 삭제하고, CloudTrail log를 체크해서 승인되지 않은 활동이 있는지 확인하고 검토하라.
현재 가지고 있는 IAM User에서 Access key를 새로 발급받았다. 그 후 spring에 사용하는 키 값들을 교체해주었다.
이후 코드가 잘 돌아간다 !!!! 해결완료
우리 모두 보안에 대해서 각별한 주의를 기울일 필요가 있다. AWS에서 보내는 이메일에 대해 크게 신경쓰지 않았는데, 이런 문제가 있었는지 몰랐다.. 처음 코드에 에러가 떴을 때, AWS root 계정에 대한 Access Key, Secret Key를 Spring에 넣어두고 메서드를 실행해 봤는데 정상작동하였다. 하지만, 아무리 생각해도 root 계정의 키는 사용하지 않는게 바람직하다고 생각했고, 다른 방법을 찾아보다보니, S3를 연결하는 IAM 계정에 문제가 생겼음을 알게 되었다. 처음 AWS 이메일을 잘 정독하고 해결방안을 찾았으면 생고생을 하지 않았을 텐데,, 다음부턴 보안에 더 신경쓰고, 이메일을 잘 확인해서 문제가 발생하면 바로바로 수정할 수 있도록 노력해야겠다.