AWS Cognito๋กœ ๋น„๊ณต๊ฐœ S3 ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•

Cognito ์‚ฌ์šฉ์ž ํ’€, API Gateway, Lambda ๋ฐ S3 ํ†ตํ•ฉ์„ ํ†ตํ•ด ๋น„๊ณต๊ฐœ ํŒŒ์ผ์— ์•ˆ์ „ํ•˜๊ฒŒ ์•ก์„ธ์Šคํ•˜๋Š” ๊ฐ€์ด๋“œ.

N
Necmettin Demir
2023๋…„ 7์›” 21์ผ
๋กœ๋”ฉ ์ค‘...

AWS Cognito๋กœ ๋น„๊ณต๊ฐœ S3 ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•

AWS Cognito S3
AWS Cognito S3

์‹œ๋‚˜๋ฆฌ์˜ค

๊ณ ๊ฐ์„ ์œ„ํ•ด ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ ˆ์ฝ”๋“œ์™€ ๊ด€๋ จ๋œ PDF, Word, Excel ๋“ฑ์˜ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ํŒŒ์ผ์ด AWS์˜ ๋‹จ์ผ ๋น„๊ณต๊ฐœ(private) S3 ๋ฒ„ํ‚ท์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ URL ๋งํฌ๋ฅผ ํ†ตํ•ด ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์—์„œ ์ด๋Ÿฌํ•œ ๊ด€๋ จ ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์†”๋ฃจ์…˜์€ ์‚ฌ๋‚ด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์œ„ํ•œ ์ด์‹ ๊ฐ€๋Šฅํ•œ(portable) ์†”๋ฃจ์…˜์œผ๋กœ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์†Œ๊ฐœ

์ด ๋ฌธ์„œ์˜ ๋ชฉ์ ์€ Cognito ์‚ฌ์šฉ์ž ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์˜ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Cognito ์™ธ์—๋„ Cognito์—์„œ Authorizer๊ฐ€ ์žˆ๋Š” API Gateway๋กœ์˜ ํ๋ฆ„๊ณผ API Gateway์™€ Lambda์˜ ํ˜‘๋ ฅ๋„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
AWS ์ฝ˜์†”์˜ ๊ฐ ๋‹จ๊ณ„์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ์Šคํฌ๋ฆฐ์ƒท์ด ๊ณต์œ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•ด ๋‹จ๊ณ„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์‹œ๊ฐ ์ž๋ฃŒ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ

์ด ๋ฌธ์„œ์—์„œ ๊ฐœ๋ฐœ๋œ ๋‚ด์šฉ์„ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์‚ฌ์ „ ์ฝ๊ธฐ๊ฐ€ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ AWS ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ๋‹ค์Œ ๋งํฌ๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค:

๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋‚˜์š”?

์ด๋Ÿฌํ•œ ์ž‘์—…์— ๋Œ€ํ•ด ๋งŽ์€ ํ๋ฆ„์ด๋‚˜ ๋ฐฉ๋ฒ•์„ ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์•„๋ž˜์—์„œ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋‚˜๋ฆฌ์˜ค ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…์ด ์•„๋ž˜ ์ด๋ฏธ์ง€์— ์ œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ์ด๋ฏธ์ง€๋Š” Cognito ์‚ฌ์šฉ์ž ํ’€, S3 ๋ฒ„ํ‚ท, API Gateway ๋ฉ”์„œ๋“œ, Lambda ํ•จ์ˆ˜ ๋“ฑ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. AWS ํ™˜๊ฒฝ์—์„œ ๋ชจ๋“  ์—”ํ„ฐํ‹ฐ๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ๋ชจ๋‘ ํ•จ๊ป˜ ํ˜‘๋ ฅํ•˜์—ฌ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜
์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜
AWS ํ™˜๊ฒฝ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด API ๋ฉ”์„œ๋“œ์™€ ํ•จ๊ป˜ Lambda๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Lambda ํ•จ์ˆ˜๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด API Gateway ๋ฉ”์„œ๋“œ ์ƒ์„ฑ ์‹œ ์ด ํ•จ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์š”

๋‹ค์Œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์ฐพ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์˜ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด AWS ๊ณ„์ •์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.
  1. ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์€ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๋‚˜์š”?
  2. ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์˜ ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์ •์ฑ…์€ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๋‚˜์š”?
  3. ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์˜ ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ Lambda ํ•จ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๋‚˜์š”?
  4. Lambda ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ Gateway API๋Š” ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๋‚˜์š”?
  5. ์›น ํด๋”๋กœ ์‚ฌ์šฉํ•  ๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์€ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๋‚˜์š”?
  6. Cognito ์‚ฌ์šฉ์ž ํ’€์€ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •์„ ๊ตฌ์„ฑํ•˜๋‚˜์š”?
  7. ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๋‚˜์š”?

1. ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์€ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๋‚˜์š”?

S3๋Š” AWS์—์„œ ์ง€์—ญ ๊ธฐ๋ฐ˜(region-based) ์„œ๋น„์Šค ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. S3 ๋ฒ„ํ‚ท์˜ ํ•ญ๋ชฉ์„ ๊ฐ์ฒด(object)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ AWS์—์„œ S3 ๋ฒ„ํ‚ท์— ๋Œ€ํ•ด ๊ฐ์ฒด์™€ ํŒŒ์ผ ์šฉ์–ด๋Š” ์„œ๋กœ ๋ฐ”๊ฟ” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
"๋ชจ๋“  ๊ณต๊ฐœ ์•ก์„ธ์Šค ์ฐจ๋‹จ"(Block All Public Access) ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜์„ธ์š”. ์—ฌ๊ธฐ์„œ ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
S3 ๋ฒ„ํ‚ท ์ƒ์„ฑ
S3 ๋ฒ„ํ‚ท ์ƒ์„ฑ
๋น„๊ณต๊ฐœ ์•ก์„ธ์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด S3 ๋ฒ„ํ‚ท์— ์ผ๋ถ€ ๊ฐ์ฒด๋ฅผ ์—…๋กœ๋“œํ•˜์„ธ์š”. ์ดํ›„ ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๋‚˜ ๊ฐ€๋Šฅํ•œ ์•ก์„ธ์Šค ๋งํฌ๋กœ ์ด๋Ÿฌํ•œ ๊ฐ์ฒด์— ์•ก์„ธ์Šค๋ฅผ ์‹œ๋„ํ•˜์„ธ์š”.
ํŒŒ์ผ ์—…๋กœ๋“œ
ํŒŒ์ผ ์—…๋กœ๋“œ

2. ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์˜ ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ์ •์ฑ… ์ƒ์„ฑ

AWS์—์„œ IAM(Identity and Access Management)์€ ๋ชจ๋“  ์„œ๋น„์Šค์˜ ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค! ์‚ฌ์šฉ์ž, ๊ทธ๋ฃน, ์—ญํ•  ๋ฐ ์ •์ฑ…์€ ์šฐ๋ฆฌ๊ฐ€ ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•  ๊ธฐ๋ณธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
๋งŽ์€ ๊ธฐ๋ณธ ์ œ๊ณต(built-in) ์—ญํ• ์ด ์žˆ์œผ๋ฉฐ ๊ฐ ์—ญํ• ์—๋Š” ๊ถŒํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๋งŽ์€ ๊ธฐ๋ณธ ์ œ๊ณต ์ •์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ "AWS Managed"๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ "Customer Managed"(๊ณ ๊ฐ ๊ด€๋ฆฌ) ์—ญํ•  ๋ฐ ์ •์ฑ…์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์—์„œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • IAM ์ •์ฑ…์„ ์ƒ์„ฑํ•˜์„ธ์š”.
  • AWS์˜ ๊ธฐ์กด ์ •์ฑ… ๋ชฉ๋ก์„ ์ฐพ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์—์„œ๋งŒ GetObject ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ƒˆ ์ •์ฑ…์„ ์ƒ์„ฑํ•˜์„ธ์š”:
์ •์ฑ… ๋ชฉ๋ก
์ •์ฑ… ๋ชฉ๋ก
์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ์ž ์ง€์ • ์ •์ฑ…์„ ์ƒ์„ฑํ•˜์„ธ์š”. ์„œ๋น„์Šค๋กœ S3๋ฅผ, ์ž‘์—…(action)์œผ๋กœ GetObject๋งŒ ์„ ํƒํ•˜์„ธ์š”:
์ •์ฑ… ์„ค์ • 1
์ •์ฑ… ์„ค์ • 1
๋ฆฌ์†Œ์Šค(resource)๋กœ "specific"์„ ์„ ํƒํ•˜๊ณ  ์ •์ฑ…์ด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๋„๋ก ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์„ ์ง€์ •ํ•˜์„ธ์š”:
์ •์ฑ… ์„ค์ • 2
์ •์ฑ… ์„ค์ • 2
์ •์ฑ…์— ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ณ  ์ƒ์„ฑํ•˜์„ธ์š”.
์ •์ฑ… JSON ์ •์˜:
JSON
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::private-s3-for-interfacing/*"
        }
    ]
}

3. ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์˜ ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ Lambda ํ•จ์ˆ˜ ์ƒ์„ฑ

์—ฌ๊ธฐ์„œ๋Š” Lambda ํ•จ์ˆ˜์— NodeJS์˜ ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. Lambda ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  NodeJS๋ฅผ ์„ ํƒํ•˜์„ธ์š”.
Lambda ์ƒ์„ฑ
Lambda ์ƒ์„ฑ
๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ œ๊ณต๋œ ์ƒ˜ํ”Œ ์ฝ”๋“œ๋กœ ๊ต์ฒดํ•˜์„ธ์š”. ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„ Lambda ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด "Deploy" ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์„ธ์š”.
NodeJS Lambda ์ฝ”๋“œ (Blob์œผ๋กœ ๋ฐ˜ํ™˜):
JavaScript
const AWS = require('aws-sdk');
const S3= new AWS.S3();
exports.handler = async (event, context) => {
    
  let fileName;
  let bucketName;
  let contentType;
  let fileExt;
    
  try {
    bucketName = 'private-s3-for-interfacing';
    fileName = event["queryStringParameters"]['fn']
    contentType = 'application/pdf';
    fileExt = 'pdf';
    
    fileExt = fileName.split('.').pop();
    
    switch (fileExt) {
        case 'pdf': contentType = 'application/pdf'; break;        
        case 'png': contentType = 'image/png'; break;
        case 'gif': contentType = 'image/gif'; break;
        case 'jpeg': case 'jpg': contentType = 'image/jpeg'; break;
        case 'docx': contentType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; break;
        case 'xlsx': contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; break;
        default: ;
    }
    
    const data = await S3.getObject({Bucket: bucketName, Key: fileName}).promise();
    
    return {
       headers: {
          'Content-Type': contentType,
          'Content-Disposition': 'attachment; filename=' + fileName,
          'Content-Encoding': 'base64',
          'Access-Control-Allow-Origin': '*',
          'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token', 
          'Access-Control-Allow-Methods': 'GET,OPTIONS'
      },
      body: data.Body.toString('base64'),
      isBase64Encoded: true,
      statusCode: 200
    }
  } catch (err) {
    return {
      statusCode: err.statusCode || 400,
      body: err.message || JSON.stringify(err.message)
    }
  }
}
Lambda ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•จ๊ป˜ ์—ญํ• ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์—ญํ• ์—๋Š” ๋น„๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์˜ ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•  ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑํ•œ "Customer Managed" ์ •์ฑ…์„ Lambda ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ ์ด ์—ญํ• ์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์—ญํ•  ์ฐพ๊ธฐ
์—ญํ•  ์ฐพ๊ธฐ
์ด์ „ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์ •์ฑ…์„ ์ด ์—ญํ• ์— ์—ฐ๊ฒฐํ•˜์„ธ์š”.
์ •์ฑ… ์—ฐ๊ฒฐ
์ •์ฑ… ์—ฐ๊ฒฐ

4. Lambda ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ Gateway API ์ƒ์„ฑ

์•„๋ž˜์™€ ๊ฐ™์ด AWS Gateway REST API๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”. "REST" API๋ฅผ "New API"๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
REST API ์ƒ์„ฑ
REST API ์ƒ์„ฑ
AWS GW API๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
  • API ์ƒ์„ฑ
  • Resource ์ƒ์„ฑ
  • Method ์ƒ์„ฑ
  • API ๋ฐฐํฌ(Deploy)
REST API์— ๋Œ€ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด Resource๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
Resource ์ƒ์„ฑ
Resource ์ƒ์„ฑ
์ƒ์„ฑํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด GET ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”. ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑํ•œ Lambda ํ•จ์ˆ˜๋ฅผ ์ด ๋ฉ”์„œ๋“œ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.
GET Method ์ƒ์„ฑ
GET Method ์ƒ์„ฑ
Lambda Proxy Integration์ด ์—ฌ๊ธฐ์—์„œ ์ฒดํฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ†ตํ•ด Lambda ํ•จ์ˆ˜์—์„œ ๋ชจ๋“  ์‘๋‹ต ๊ด€๋ จ ์ฝ˜ํ…์ธ ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Lambda Proxy ํ†ตํ•ฉ
Lambda Proxy ํ†ตํ•ฉ
์•„๋ž˜์™€ ๊ฐ™์ด Gateway API์— ๋Œ€ํ•ด CORS๋ฅผ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”.
CORS ํ™œ์„ฑํ™”
CORS ํ™œ์„ฑํ™”
AWS Gateway ๋ฉ”์„œ๋“œ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฒƒ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑํ•œ ํ›„ ์ด์ œ API๋ฅผ ๋ฐฐํฌ(deploy)ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.
API ๋ฐฐํฌ
API ๋ฐฐํฌ
API ๊ฒŒ์ดํŠธ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•˜๋ ค๋ฉด Authorizer(์ธ์ฆ์ž)๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด Cognito Authorizer๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Cognito Authorizer ์ •์˜
Cognito Authorizer ์ •์˜

5. ์›น ํด๋”๋กœ ์‚ฌ์šฉํ•  ๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท

์†”๋ฃจ์…˜์—๋Š” ๋‘ ๊ฐœ์˜ S3 ๋ฒ„ํ‚ท์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์ด์ „ ์„น์…˜์—์„œ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์ง€๊ธˆ ์ƒ์„ฑ๋˜๋ฉฐ ์›น ํด๋”๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๋‘ S3 ๋ฒ„ํ‚ท ๊ตฌ์กฐ
๋‘ S3 ๋ฒ„ํ‚ท ๊ตฌ์กฐ
์›น ํด๋”๋กœ ๊ณต๊ฐœ S3 ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•˜์„ธ์š”. ์ด ๋ฒ„ํ‚ท์—๋Š” callback.html ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด Cognito ์ฝœ๋ฐฑ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. Cognito ์‚ฌ์šฉ์ž ํ’€ ์ƒ์„ฑ ๋ฐ ๊ตฌ์„ฑ

  • Callback ์ฃผ์†Œ: https://web-s3-for-interfacing.s3.eu-west-2.amazonaws.com/Callback.html
  • OAuth 2.0 Flows: "implicit grant" ์˜ต์…˜์„ ์„ ํƒํ•˜์„ธ์š”.
  • OAuth 2.0 Scopes: email, openid, profile.
Cognito Hosted UI ๋งํฌ์—๋Š” ์—ฌ๋Ÿฌ URL ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
Client App ์ƒ์„ฑ
Client App ์ƒ์„ฑ
App Client ์„ค์ •
App Client ์„ค์ •

7. ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๋‚˜์š”?

Cognito ์‚ฌ์šฉ์ž ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œํ•œ๋œ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” API๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  ์ตœ์ข… ์‚ฌ์šฉ์ž๋Š” ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋งํฌ๋ฅผ ํด๋ฆญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LinkToS3Files.html ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์ด ๋ฌธ์„œ๊ฐ€ AWS ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์„ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๋ถ„๋“ค์—๊ฒŒ ์œ ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ์„œ๋น„์Šค

AWS, Azure ๋ฐ Google Cloud ํ”Œ๋žซํผ์—์„œ ์ธํ”„๋ผ ์„ค๊ณ„, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ๊ด€๋ฆฌ ๋ฐ ์ตœ์ ํ™” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๋ณด๊ธฐ

๋ฌธ์˜ํ•˜๊ธฐ

AWS ๋ฐ ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์–ป์œผ๋ ค๋ฉด ํŒ€์— ๋ฌธ์˜ํ•˜์„ธ์š”.

๋ฌธ์˜