기존에 pre-signed url을 사용해서 파일들을 업로드를 하곤 하였다
이에 관련해서 git에도 정리를 해놓았었는데 이해하고 사용한 줄 알고 있었으나 그렇지 않았다.
단순히 업로드용으로 사용하는 기능 중 하나라 생각했지만 이는 우아한 테크 세미나 - 사례별로 알아보는 안전한 s3 보안 가이드 영상을 보다가 일부분만 사용하고 있었다는 것을 알게 되었다.
Pre-signed url 란?
프라이빗 상태인 객체 및 버킷을 pre-signed url을 통해 선택적으로 객체를 공유하거나 클라이언트가 aws 보안 자격 증명이나 권한 없이 버킷에 객체를 업로드하는 것을 허용하게 할 수 있다.
여기서 중점은 바로 선택적, 권한 없이 이 부분이다.
Pre-Signed url을 사용할 수 있는 보안 인증정보의 유형과 해당하는 최대 URL 수명은 아래와 같다.
- IAM 인스턴스 프로파일: 최대 6시간 동안 유효함.
- AWS Security Token Service: 보안 인증 정보 유효 기간까지 유효합니다. AWS STS API 작업 비교를 참조하세요.
- IAM 사용자: AWS 서명 버전 4를 사용할 경우 최대 7일 동안 유효함.
이 외에 대용량의 파일 같은 경우에 url이 만료가 되어도 연결이 끊어지지만 않는다면 다운로드는 완료할 수 있다고 한다.
(코드는 javascript 로 작성되어 있다. => aws lambda로 실행)
객체 업로드
import AWS, {S3} from "aws-sdk";
// s3 config 부분은 lambda에선 작성하지 않아도 된다.
export const s3 = new S3({
region: "리전",
signatureVersion: "v4",
accessKeyId: "엑세스 키 ID",
secretAccessKey: "Secret 키",
});
export async function getPresignedUrl(id: string) {
const params = {
Bucket: "s3 버킷",
// 폴더안에 있는 객체의 경우 경로를 적어주면 된다 (ex. upload/test.json)
Key: `객체명`,
// ContentType: 'image/*',
ContentType: "application/json",
Expires: 10000,
};
const signedUrl = await s3.getSignedUrlPromise("putObject", params);
console.log(signedUrl);
return signedUrl;
}
docs에 있는 예시 코드는 많이 복잡해보이지만 정리해서 주요 기능만 보여주면 위와 같다.
위의 함수를 실행해주면 pre-signed url (미리 생성된 url)이 return 된다.
return 된 url에 PUT 요청으로 업로드할 파일을 넣어주면 된다.
현재 사용중인 부분은 프런트에서 파일을 업로드할 때 pre-signed url로 업로드를 하여 백에서 multer나 base64를 사용해 파일을 다룰 필요가 없어졌다.
객체 공유
import AWS, {S3} from "aws-sdk";
// s3 config 부분은 lambda에선 작성하지 않아도 된다.
export const s3 = new S3({
region: "리전",
signatureVersion: "v4",
accessKeyId: "엑세스 키 ID",
secretAccessKey: "Secret 키",
});
export async function getPresignedUrl(id: string) {
const params = {
Bucket: "s3 버킷",
// 폴더안에 있는 객체의 경우 경로를 적어주면 된다 (ex. upload/test.json)
Key: `객체명`,
// ContentType: 'image/*',
ContentType: "application/json",
Expires: 10000,
};
const signedUrl = await s3.getSignedUrlPromise("getObject", params);
console.log(signedUrl);
return signedUrl;
}
사실 똑같다.. 똑같은데 getSignedUrl 내부에 getObject로 변경하면 된다.
해당 url을 사용하려면 S3버킷의 CORS 설정이 올바르게 되어 있어야 한다. 특히, pre-signed URL을 사용하는 클라이언트가 S3 버킷에서 객체를 다운로드할 수 있도록 허용되어야 한다.
해당 부분은 저장된 로그를 일시적으로 불러올 때 등 사용 중이다.
이 외에 우아한 부트캠프의 영상을 보면 s3를 위한 나머지 4가지의 보안가이드 들이 존재한다.
그중 간략하게 하나만 얘기하면 현재 프런트 팀을 위해 구축해 놓은 정적 웹 호스팅 버킷이 있는데
Cloudfront(CDN)을 통해 배포를 하고 OAI 설정을 통해 S3 direct 접근을 막는 방식이다.
물론 이를 위해 route53 사용, 버킷을 퍼블릭 설정을 해야 한다는 점이 있지만 빠른 배포와 간단한 파이프라인으로 인해 사용했을 때 나쁘지 않은 방식 같았다.
'AWS' 카테고리의 다른 글
NAT Gateway란? (0) | 2023.06.27 |
---|---|
Network ACL vs 보안그룹 (0) | 2023.06.20 |
파일 다운로드 속도 비교(S3 GetObject vs axios get) (0) | 2023.06.05 |
AWS SES (with aws-sdk) (0) | 2023.05.23 |