์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[์€ผ] S3์— ์—…๋กœ๋“œํ•œ ์‚ฌ์ง„ : S3 ํผ๋ธ”๋ฆญ ์—‘์„ธ์Šค ์ฐจ๋‹จ ํ™œ์„ฑํ™”(1)

๋ณธ๋ฌธ

๊ธฐ์กด ๊ตฌํ˜„ ์ƒํ™ฉ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด, 

๊ธฐ์กด ๊ตฌํ˜„ ์ƒํ™ฉ

1. IAM ์‚ฌ์šฉ์ž์—๊ฒŒ S3FullAccess ๊ถŒํ•œ์„ ์ฃผ์—ˆ๋‹ค 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "s3-object-lambda:*"
            ],
            "Resource": "*"
        }
    ]
}

2. ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ์„ ํ‘ผ ์ฑ„ S3 ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ–ˆ๋‹ค 

3. ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•„๋ž˜์™€ ๊ฐ™์€ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์„ค์ •์„ ํ•˜์˜€๋‹ค 

implementation group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '1.12.518'
๋”๋ณด๊ธฐ
@Configuration
public class AmazonS3Config {

	@Value("${cloud.aws.credentials.accessKey}")
	private String accessKey;

	@Value("${cloud.aws.credentials.secretKey}")
	private String secretKey;

	@Value("${cloud.aws.region.static}")
	private String region;

	@Bean
	public AmazonS3Client amazonS3Client() {
		AWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKey, secretKey);
		return (AmazonS3Client)AmazonS3ClientBuilder
			.standard()
			.withCredentials(new AWSStaticCredentialsProvider(basicAWSCredentials))
			.withRegion(region)
			.build();
	}
}

 

4.  IAM ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์— S3์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์ง„ ๋“ฑ๋ก์„ ์š”์ฒญํ•˜๋ฉด, 
์€ผ ๋ฐฑ์—”๋“œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์—…๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค. 
 
5. ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ฐ์ฒด URL์„ ์ „๋‹ฌํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฅผ ํ™”๋ฉด์— ๋ณด์—ฌ์คฌ๋‹ค 
 

์ด ๋ถ€๋ถ„์—์„œ ๋ฌธ์ œ์ ๋“ค์„ ํ•˜๋‚˜์”ฉ ์งš์–ด๋ณด์ž๋ฉด, 

1. IAM ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋“  S3๊ฐ์ฒด์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 
์ง€๊ธˆ ๋ฒ„ํ‚ท์ด ํ•˜๋‚˜๋ฐ–์— ์—†๊ธด ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์„œ๋น„์Šค ๋ฒ„ํ‚ท์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ด๋‹ค.
 
2. S3์— ์ˆ˜๋งŽ์€ Get์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉฐ ๋А๋ฆฌ๋‹ค

3. ํ•ด๋‹น ๊ฐ์ฒด๋Š” ์ธํ„ฐ๋„ท ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ์ฒด URL ๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ด๋‹ค. 
 ์€ผ ์‚ฌ์šฉ์ž๋“ค๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. (์ด๊ฑฐ๋ฅผ ํ•ซ๋งํฌ ๋ฌธ์ œ๋ผ๊ณ  ํ•œ๋‹ค๋Š” ๊ฑธ ๋ฐฐ์› ๋‹ค)

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด,

1. IAM ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ(Resource)์„ ์ถ•์†Œํ•˜์˜€๋‹ค

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"s3:*",
		        "s3-object-lambda:*"

			],
			"Resource": [
				"arn:aws:s3:::vvue-s3",
				"arn:aws:s3:::vvue-s3/*"
			]
		}
	]
}

 
2. CloudFront ๋„์ž…
 - S3 ๋ฒ„ํ‚ท ์•ž์— CloudFront ๋„์ž… 
CloudFront๋Š” ์ •์ , ๋™์  ์ปจํ…์ธ ๋ฅผ ๋น ๋ฅด๊ฒŒ ์‘๋‹ตํ•˜๊ธฐ ์œ„ํ•œ ์บ์‹œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” CDN์„œ๋น„์Šค์ด๋‹ค.
 
์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ณด์ž
https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/Introduction.html

 

Amazon CloudFront๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? - Amazon CloudFront

Amazon CloudFront๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Amazon CloudFront๋Š” .html, .css, .js ๋ฐ ์ด๋ฏธ์ง€ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ์ •์  ๋ฐ ๋™์  ์›น ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋นจ๋ฆฌ ๋ฐฐํฌํ•˜๋„๋ก ์ง€์›ํ•˜๋Š” ์›น ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. CloudFront๋Š” ์—ฃ์ง€ ๋กœ์ผ€์ด์…˜

docs.aws.amazon.com

 

CloudFront์™€ S3๋ฅผ ์—ฐ๋™ํ•ด๋ณด์ž

 
1. CloudFront์—์„œ ๋ฒ„ํ‚ท์— ๋Œ€ํ•œ ๋ฐฐํฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 

์›๋ณธ ์—‘์„ธ์Šค ์ œ์–ด ์„ค์ •(๊ถŒ์žฅ)์„ ์„ ํƒํ•˜๊ณ  Create OAC ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ƒ์„ฑํ•œ๋‹ค

2. S3 ๋ฒ„ํ‚ท ์ •์ฑ…์„ ๋ณต์‚ฌํ•ด์„œ ๋ณ€๊ฒฝํ•˜๊ณ  ํผ๋ธ”๋ฆญ์—‘์„ธ์Šค ์ฐจ๋‹จ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค 

๊ทธ๋Ÿฌ๋ฉด ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ๋œฌ๋‹ค
{
        "Version": "2008-10-17",
        "Id": "PolicyForCloudFrontPrivateContent",
        "Statement": [
            {
                "Sid": "AllowCloudFrontServicePrincipal",
                "Effect": "Allow",
                "Principal": {
                    "Service": "cloudfront.amazonaws.com"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::๋ฒ„ํ‚ท๋ช…/*",
                "Condition": {
                    "StringEquals": {
                      "AWS:SourceArn": "arn:aws:cloudfront::์ˆซ์ž:distribution/๋ฌธ์ž"
                    }
                }
            }
        ]
      }
๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด URL์œผ๋กœ๋Š” ๋”์ด์ƒ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค

 

CloudFront ๋„๋ฉ”์ธ + ๊ฐ์ฒด ์œ„์น˜ ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•œ๋‹ค https://์˜๋ฌธ.cloudfront.net/a.jpg

 
 3. (์„ ํƒ์‚ฌํ•ญ) CloudFront์˜ ๋ฐฐํฌ > ์„ค์ •์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๋Œ€์ฒด ๋„๋ฉ”์ธ์„ ๋“ฑ๋กํ•œ๋‹ค
 
1) Request certificate๋ฅผ ๋ˆŒ๋Ÿฌ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์ž…๋ ฅํ•œ๋‹ค 

๊ทธ๋Ÿฌ๋ฉด ๋„๋ฉ”์ธ ์˜์—ญ์— ๊ฒ€์ฆ๋Œ€๊ธฐ์ค‘์ด๋ผ๊ณ  ๋œจ๋ฉฐ
์œ ํ˜•,  CNAME์ด๋ฆ„, CNAME๊ฐ’์ด  ๋‚˜์˜ค๋Š”๋ฐ 
์ด ๊ฐ’์„ ์ž…๋ ฅํ•ด์„œ ๊ฒ€์ฆ์„ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค 
 
2) ๊ฐ€๋น„์•„์—์„œ ๋„๋ฉ”์ธ์„ ๊ตฌ์ž…ํ–ˆ์œผ๋ฏ€๋กœ ๊ฐ€๋น„์•„์— ๊ฐ€์„œ 
์œ„์˜ ๊ฒ€์ฆ๊ฐ’๊ณผ ํ•จ๊ป˜ CNAME ๋„๋ฉ”์ธ์ด๋ฆ„ ํด๋ผ์šฐ๋“œํ”„๋ก ํŠธ๋„๋ฉ”์ธ ์„ ์ž…๋ ฅํ•œ๋‹ค
 
30์ดˆ๋„ ์•ˆ๋˜์–ด์„œ ๋ฐœ๊ธ‰๋˜์—ˆ๋‹ค๊ณ  ๋œจ๊ฒŒ ๋œ๋‹ค 
์ €์žฅ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋„๋ฉ”์ธ ๋“ฑ๋ก์ด ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉฐ ๋Œ€์ฒด ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ๋„ ์‚ฌ์ง„์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค 
 

๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋„๋ฉ”์ธ์—์„œ๋งŒ ์ด๋ฏธ์ง€์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด๋ณด์ž 
(ํ•ซ๋งํฌ ๋ฐฉ์ง€)

 
๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค (์•„๋ž˜ ๋งํฌ ํ™•์ธ)
https://aws.amazon.com/ko/blogs/security/how-to-prevent-hotlinking-by-using-aws-waf-amazon-cloudfront-and-referer-checking/

 

How to Prevent Hotlinking by Using AWS WAF, Amazon CloudFront, and Referer Checking | Amazon Web Services

At some point, you might have to deal with hotlinking: when third parties embed in their websites the content they find on your websites. The third-party website does not incur the cost of hosting the content, which means your website can end up paying for

aws.amazon.com

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html

 

Serve private content with signed URLs and signed cookies - Amazon CloudFront

Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.

docs.aws.amazon.com

2ํŽธ์—์„œ ๊ณ„์†...

 

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ