์ผ๋ฐ์ ์ผ๋ก ๋ง์ ํ๋ก์ ํธ๋ค์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฏธ์ง ์
๋ก๋ ํ๋ ๊ธฐ๋ฅ๋ค์ด ๋ง์ด ๋ค์ด๊ฐ๋๋ค.
๊ทธ๋์ AWS ๊ธฐ๋ฐ์ผ๋ก S3 + CloudFront + Presigned URL ์กฐํฉ์ ์ฌ์ฉํ๋ฉด ๋น ๋ฅด๊ณ
์์ ํ๋ฉฐ ๋น์ฉ ํจ์จ์ ์ธ ์ด๋ฏธ์ง ์
๋ก๋๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
ํ๋ฆ
โ ์ฅ์ : ์๋ฒ ๋ถํ ์ต์ํ + ๋น ๋ฅธ CDN ์กฐํ + ๋ณด์ ๊ฐํ
@Service
@RequiredArgsConstructor
public class S3Service {
private final AmazonS3 amazonS3;
private final String bucketName = "demo-images";
public String generatePresignedUrl(String fileName) {
Date expiration = new Date(System.currentTimeMillis() + 1000 * 60 * 5); // 5๋ถ ์ ํจ
GeneratePresignedUrlRequest request =
new GeneratePresignedUrlRequest(bucketName, fileName)
.withMethod(HttpMethod.PUT)
.withExpiration(expiration);
return amazonS3.generatePresignedUrl(request).toString();
}
}
await axios.put(presignedUrl, file, {
headers: { "Content-Type": file.type }
});
(์์ ๋ค์ด์ด๊ทธ๋จ: S3 + CloudFront + Presigned URL ๊ตฌ์กฐ)
์
๋ก๋ ์๋น์ค๋ XSSยทํ์ผ ์์ฅยท๋์ฉ๋ ์
๋ก๋์ ์ทจ์ฝํ ์ ์์ต๋๋ค.
์๋ ๋ณด์ ์ ๋ต์ ์ ์ฉํ๋ฉด ์์ ํฉ๋๋ค.
jpg, png, webp)image/ ๋ก ์์ ์ฌ๋ถ)S3 + CloudFront + Presigned URL
๊ตฌ์กฐ๋ฅผ ์ ์ฉํ๋ฉด ์๋ฒ ๋ถํ๋ฅผ ์ต์ํํ๊ณ ,
๋ณด์ยท์๋ยท๋น์ฉ ๋ชจ๋ ๋ฉด์์ ํจ์จ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.