[Web Server] ๊ธฐ์ดˆ : CORS

hosik kimยท2021๋…„ 11์›” 10์ผ
0

With CodeStates

๋ชฉ๋ก ๋ณด๊ธฐ
15/45
post-thumbnail

๐Ÿ’ก Origin์˜ ์˜๋ฏธ


: ๋จผ์ €, CORS์—์„œ์˜ Origin๋ž€? ํ•œ๊ตญ๋ง๋กœ๋Š” '์ถœ์ฒ˜'๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์ธ๋ฐ,
์ด๋Š” URL, ๋„๋ฉ”์ธ ๋“ฑ๊ณผ ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ ์—„์—ฐํžˆ ์˜๋ฏธ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ™•์‹คํžˆ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

Origin์€ URL์—์„œ์˜ ํ”„๋กœํ† ์ฝœ, ๋„๋ฉ”์ธ, ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํ•ฉ์นœ ๋ถ€๋ถ„์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ URL์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๋ฉด

URL: https://naver.com:80/posts/123456?data=789#abc

  • ํ”„๋กœํ† ์ฝœ(Scheme์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.) = https://
  • ๋„๋ฉ”์ธ = naver.com
  • ํฌํŠธ ๋ฒˆํ˜ธ = :80
  • Origin =https://naver.com:80

Origin : https://naver.com:80



๐Ÿ’ก CORS ๋™์ž‘์›๋ฆฌ


: CORS์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘ ์›๋ฆฌ๋Š” ๋‹จ์ˆœํ•˜๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค๋ฅธ Origin์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ Origin ํ—ค๋”์— ์ž์‹ ์˜ Origin์„ ์„ค์ •ํ•˜๊ณ ,
์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ์‘๋‹ต์˜ Allow-Control-Allow-Origin ํ—ค๋”์— ์„ค์ •๋œ Origin์˜ ๋ชฉ๋ก์˜ ์š”์ฒญ์˜ Origin ํ—ค๋” ๊ฐ’์ด ํฌํ•จ๋˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰, CORS ์š”์ฒญ์„ ์œ„ํ•ด์„œ๋Š” ์„œ๋ฒ„์—์„œ์˜ ์‘๋‹ต์˜ Allow-Control-Allow-Origin ํ—ค๋”์˜ ํ—ˆ์šฉ๋˜๋Š” Origin์˜ ๋ชฉ๋ก ํ˜น์„์™€์ผ๋“œ์นด๋“œ(*)๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์™€์ผ๋“œ์นด๋“œ(*)๋Š” ๋ชจ๋“  Origin์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ํŠน์ˆ˜ ๊ธฐํ˜ธ

CORS ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธ ๊ฐ€์ง€์˜ ์œ ํ˜•์œผ๋กœ ๋‚˜๋ˆ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”ธ ๋‹จ์ˆœ ์š”์ฒญ (Simple Request)


๋‹จ์ˆœ ์š”์ฒญ(Simple Request)์€ ๊ณต์‹ ์šฉ์–ด๊ฐ€ ์•„๋‹Œ, MDN์—์„œ ์‚ฌ์šฉํ•œ ์šฉ์–ด๋ฅผ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ด๋‹ค.
๋‹จ์ˆœ ์š”์ฒญ์€ ํ”ํ•œ ์œ ํ˜•์˜ ์š”์ฒญ์ด ์•„๋‹ˆ๋ฉฐ, ๋‹จ์ˆœ ์š”์ฒญ์ด ๋˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์ด ๋งค์šฐ ๊นŒ๋‹ค๋กญ๋‹ค.

  • ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ
    • GET
    • HEAD
    • POST
  • User Agent๊ฐ€ ์ž๋™์œผ๋กœ ์„ค์ •ํ•œ ํ—ค๋”๋ฅผ ์ œ์™ธํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ํ—ค๋”๋“ค๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type
    • DPR
    • Dounlink(en-US)
    • Save-Data
    • Viewport-Width
    • Width
  • Content-Type ํ—ค๋”์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ’๋“ค๋งŒ ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • application/x-www-form-urlencode
    • multipart/from-data
    • text/plain
  • . . .

์œ„์™€ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋‹จ์ˆœ ์š”์ฒญ์€ ์•ˆ์ „ํ•œ ์š”์ฒญ์œผ๋กœ ์ทจ๊ธ‰๋˜์–ด, ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ์ด ํ•„์š” ์—†์ด ๋‹จ ํ•œ ๋ฒˆ์˜ ์š”์ฒญ๋งŒ์„ ์ „์†กํ•œ๋‹ค.
์ฆ‰, ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ CORS์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๊ทธ๋ž˜๋„ ๋”ฐ๋ฅธ๋‹ค. ๋‹ค๋ฅธ Origin์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ Origin ํ—ค๋”์— ์ž์‹ ์˜ Origin์„
์„ค์ •ํ•˜๊ณ , ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ์‘๋‹ต์˜ Allow-Control-Allow-Origin ํ—ค๋”์— ์„ค์ •๋œ Origin์˜ ๋ชฉ๋ก์— ์š”์ฒญ์˜ Origin ํ—ค๋”
๊ฐ’์ด ํฌํ•จ๋˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

[๊ทธ๋ฆผ] ๋‹จ์ˆœ ์š”์ฒญ

๐Ÿ”ธ ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ (Prefilght Request)


: ์„œ๋ฒ„์— ์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „์— ์˜ˆ๋น„ ์š”์ฒญ์— ํ•ด๋‹นํ•˜๋Š” ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ (Prefilght Request)์„ ๋จผ์ € ๋ณด๋‚ด์„œ ์‹ค์ œ ์š”์ฒญ์ด
์ „์†กํ•˜๊ธฐ์— ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ์•ˆ์ „ํ•œ ์š”์ฒญ์ด๋ผ๊ณ  ํ™•์ธ์ด ๋˜๋ฉด, ๊ทธ๋•Œ์„œ์•ผ ์‹ค์ œ ์š”์ฒญ์„ ์„œ๋ฒ„์—๊ฒŒ ๋ณด๋‚ธ๋‹ค.

ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ์˜ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋ฉ”์†Œ๋“œ๋กœ OPTIONS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Origin ํ—ค๋”์— ์ž์‹ ์˜ Origin์„ ์„ค์ •ํ•œ๋‹ค.
  • Access-Control-Request-Methods ํ—ค๋”์— ์‹ค์ œ ์š”์ฒญ์— ์‚ฌ์šฉํ•  ๋ฉ”์†Œ๋“œ๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  • Access-Control-Request-Headers ํ—ค๋”์— ์‹ค์ œ ์š”์ฒญ์— ์‚ฌ์šฉํ•  ํ—ค๋”๋“ค์„ ์„ค์ •ํ•œ๋‹ค.

์„œ๋ฒ„๋Š” ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง„ ์‘๋‹ต์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.

  • Access-Control-Allow-Origin ํ—ค๋”์— ํ˜€์šฉ๋˜๋Š” Origin๋“ค์˜ ๋ชฉ๋ก ํ˜น์€ ์™€์ผ๋“œ์นด๋“œ(*)๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  • Access-Control-Allow-Methods ํ—ค๋”์— ํ—ˆ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค์˜ ๋ชฉ๋ก์„ ์„ค์ •ํ•œ๋‹ค.
  • Access-Control-Allow-Headers ํ—ค๋”์— ํ—ˆ์šฉ๋˜๋Š” ํ—ค๋”๋“ค์˜ ๋ชฉ๋ก์„ ์„ค์ •ํ•œ๋‹ค.
  • Access-Control-Max-Age ํ—ค๋”์— ํ•ด๋‹น ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ์ด ๋ธŒ๋ผ์šฐ์ €์— ์บ์‹œ ๋  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•œ๋‹ค.

์‘๋‹ต์„ ๋ฐ›๊ณ  ๋‚˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ์‘๋‹ต์˜ ์ •๋ณด๋ฅผ ์ž์‹ ์ด ์ „์†กํ•œ ์š”์ฒญ์˜ ์ •๋ณด๊ณผ ๋น„๊ตํ•˜์—ฌ ์‹ค์ œ ์š”์ฒญ์˜ ์•ˆ์ „์„ฑ์„ ๊ฒ€์‚ฌํ•œ๋‹ค. ๋งŒ์•ฝ์ด ์•ˆ์ „์„ฑ ๊ฒ€์‚ฌ์— ํ†ต๊ณผํ•˜๊ฒŒ ๋˜๋ฉด, ๊ทธ๋•Œ์„œ์•ผ ์‹ค์ œ ์š”์ฒญ์„ ์„œ๋ฒ„์—๊ฒŒ ๋ณด๋‚ธ๋‹ค.

[๊ทธ๋ฆผ] ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ (Prefilght Request)

profile
์•ˆ๋˜๋ฉด ๋  ๋•Œ๊นŒ์ง€๐Ÿ‘Œ

0๊ฐœ์˜ ๋Œ“๊ธ€