express를 사용하여 AWS S3 이미지에 액세스하기 위해 미리 서명된 URL을 생성하는 방법은 무엇입니까?
AWS S3
S3는 파일을 저장할 수 있는 스토리지 서비스입니다. 그러나 이러한 파일을 프런트 엔드 또는 다른 서비스에 노출하려는 경우. 특정 개체( file )는 공개적으로 액세스할 수 있는 권한이 필요합니다. 그것을 달성하는 몇 가지 방법이 있습니다. 이를 달성하는 방법 중 하나는 미리 서명된 URL을 사용하는 것입니다.
미리 서명된 URL이란 무엇입니까?
아래는 AWS 설명서의 스니펫입니다.
By default, all S3 objects are private. Only the object owner has permission to access them. However, the object owner can optionally share objects with others by creating a presigned URL, using their own security credentials, to grant time-limited permission to download the objects.
When you create a presigned URL for your object, you must provide your security credentials and then specify a bucket name, an object key, an HTTP method (GET to download the object), and an expiration date and time. The presigned URLs are valid only for the specified duration. If you created a presigned URL using a temporary token, then the URL expires when the token expires, even if the URL was created with a later expiration time.
Anyone who receives the presigned URL can then access the object. For example, if you have a video in your bucket and both the bucket and the object are private, you can share the video with others by generating a presigned URL. Because presigned URLs grant access to your Amazon S3 buckets to whoever has the URL, we recommend that you protect them appropriately.
미리 서명된 URL 생성
미리 서명된 URL을 생성하는 작은 서비스를 만들어 보겠습니다. 먼저 작은 업로드 서비스를 생성하여 객체를 버킷에 업로드합니다. 그런 다음 미리 서명된 URL을 사용하여 해당 개체를 검색합니다.
설정
먼저 AWS 계정이 필요하고 S3에서 버킷을 생성해야 합니다.
아래에 package.json 의존성을 나열했습니다.
"@aws-sdk/client-s3": "^3.186.0",
"@aws-sdk/s3-request-presigner": "^3.186.0",
"cors": "^2.8.5",
"express": "^4.18.1",
"morgan": "^1.10.0",
"multer": "^1.4.5-lts.1",
종속 항목이 준비되면 index.js 파일을 만들고 다음 코드를 작성합니다.
const express = require("express");
const app = express();
const BUCKET_NAME = "YOURBUCKETNAME";
const { getSignedUrl } = require("@aws-sdk/s3-request-presigner");
const { S3Client, GetObjectCommand, ListObjectsCommand, PutObjectCommand } = require("@aws-sdk/client-s3");
app.use(morgan("dev"));
const client = new S3Client({ region: "YOURS3BUCKETREGION" });
app.post("/upload", multer().single("avatar"), async (req, res) => {
const command = new PutObjectCommand({ Bucket: BUCKET_NAME, Body: req.file.buffer, Key: req.file.originalname });
const url = await getSignedUrl(client, command, { expiresIn: 3600 });
const response = await client.send(command);
res.json({ message: "File Uploaded", url: url });
});
app.listen(3001, () => console.log("API is Running is http://localhost:3001"));
위의 코드에서 키가 아바타인 파일 입력을 확인하는 미들웨어가 있는 POST 엔드포인트/업로드를 생성하고 있음을 알 수 있습니다.
다음으로 BUCKET_NAME과 본문 및 키를 사용하여 객체를 S3에 넣기 위한 명령을 생성합니다.
마지막으로 getSignedUrl 함수를 사용하여 개체의 미리 서명된 URL을 가져오고 응답으로 다시 반환합니다.
S3 버킷에 이미지를 업로드해 봅시다.
버킷에 이미지를 성공적으로 업로드했으며 미리 서명된 URL을 사용하여 이미지에 즉시 액세스할 수 있습니다.
S3 버킷을 확인합시다
S3 버킷에서 액세스할 수 없는 파일을 열려고 시도할 수 있습니다. 개체를 클릭하고 콘솔에서 외부 링크에 액세스를 시도합니다.
그러나 우리에게 다시 주어진 미리 서명된 URL에 액세스하면 이미지를 볼 수 있습니다. 그러나 특정 시간에만 제공됩니다.
미리 서명된 URL을 검색하는 또 다른 시나리오
이미지를 S3 버킷에 업로드하고 단일 객체를 가져와 미리 서명된 URL을 검색하려는 경우를 가정해 보겠습니다.
/upload와 같은 패턴을 사용할 수 있습니다.
app.get("/image/:name", async (req, res) => {
if (req.params.name) {
const command = new GetObjectCommand({ Bucket: BUCKET_NAME, Key: req.params.name });
const url = await getSignedUrl(client, command, { expiresIn: 36000 });
res.json({ url: url });
} else {
res.status(404).json({ message: "No Name Found in Key" });
}
});
GetObjectCommand, PutObjectCommand와 같은 명령을 사용하는 한 항상 해당 명령을 사용하고 getSignedUrl 함수를 사용할 수 있습니다. 키는 S3가 객체를 식별하는 데 매우 중요합니다. 키는 기본적으로 S3에 업로드한 파일 이름입니다.
미리 서명된 URL을 사용하여 공용에서 개체를 검색하는 방법에 대한 위의 두 가지 시나리오를 살펴보았습니다. 감사합니다. 이 블로그를 재미있게 읽으셨기를 바랍니다.
Reference
이 문제에 관하여(express를 사용하여 AWS S3 이미지에 액세스하기 위해 미리 서명된 URL을 생성하는 방법은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/siddude2016/how-to-create-a-presigned-url-for-accessing-aws-s3-images-using-express--3foi텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)