๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
CS/๋ณด์•ˆ

[๋ณด์•ˆ] : CORS ?

by ๊ถŒ์Šพํ–„ 2023. 8. 23.

 

CORS ? 

Cross-Origin Resource Sharing(๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ) ์˜ ์•ž์ฒ ์ž๋ฅผ ๋”ฐ์„œ ๋งŒ๋“  ์šฉ์–ด์ด๋ฉฐ,

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ JS๊ฐ€ ์–ด๋– ํ•œ ์ถœ์ฒ˜์—์„œ(origin) ๋ถˆ๋Ÿฌ์˜จ ์›น ํŽ˜์ด์ง€๊ฐ€ ๋‹ค๋ฅธ ์ถœ์ฒ˜์—์„œ ๋ถˆ๋Ÿฌ๋“ค์ด๋Š” ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ณด์•ˆ ์ •์ฑ…์ด๋‹ค.

๋งŒ์•ฝ ์„œ๋ฒ„๊ฐ€ ํ—ˆ๋ฝ์„ ํ•œ๋‹ค๋ฉด, ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์š”์ฒญ์„ ํ—ˆ๋ฝํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ๋™์˜๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ๊ฑฐ์ ˆ์„ ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ํ—ˆ๋ฝ/๊ฑฐ์ ˆ์„ ๊ตฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด HTTP-Header ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ๊ฒƒ์ธ๋ฐ, ์ด๋ฅผ CORS ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋”ฐ๋ผ์„œ ๋ธŒ๋ผ์šฐ์ €์—์„œ Cross-Origin ์š”์ฒญ์„ ์•ˆ์ „ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

Cross-Origin ?

๋‹ค์Œ ์ค‘ ํ•œ๊ฐ€์ง€๋ผ๋„ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ Cross-Origin ์ด๋ผ๊ณ  ๋งํ•œ๋‹ค.

  • ํ”„๋กœํ† ์ฝœ - http / https
  • ๋„๋ฉ”์ธ - example.com / another-example.com
  • ํฌํŠธ ๋ฒˆํ˜ธ - 3306 / 8803

์ด๋Ÿฐ ์‹์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋‘ ์ถœ์ฒ˜์˜ ํ”„๋กœํ† ์ฝœ, ๋„๋ฉ”์ธ, ํฌํŠธ๋ฒˆํ˜ธ ์ž์ฒด๊ฐ€ ์„œ๋กœ ํ•˜๋‚˜๋ผ๋„ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ Cross-Origin ์ด๋‹ค.

 

CORS์˜ ํ•„์š”์„ฑ ?

๋งŒ์•ฝ CORS ๋ณด์•ˆ ์ •์ฑ…์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ?

CORS ์ •์ฑ…์ด ์—†๋‹ค๋ฉด, ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์—์„œ ๊ธฐ์กด์˜ ์‚ฌ์ดํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ชจ๋ฐฉ์ž์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋”ฐ๋ผ์„œ, ๊ธฐ์กด ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋ฐฉ์‚ฌ์ดํŠธ์—์„œ ๋กœ๊ทธ์ธํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋ฉด ๊ทธ ๊ธฐ๋ก์„ ๊ฐ€์ง€๊ณ  ์œ ์ € ๊ฐœ๊ฐœ์ธ์˜ ์ •๋ณด์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์•…์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋œป์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ํ•„์š”์— ์˜ํ•ด์„œ๋งŒ ์„œ๋ฒ„์˜ ํ—ˆ๋ฝ์„ ๊ตฌํ•˜๊ณ  ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์•ˆ๋ฐฉ์ง€์ •์ฑ…์œผ๋กœ์จ ํ•„์š”์„ฑ์„ ๊ฐ€์ง„๋‹ค.

 

CORS์˜ ๋™์ž‘ ๋ฐฉ์‹

 

1. ๊ฐ„๋‹จ ์š”์ฒญ(Simple Request)์ธ ๊ฒฝ์šฐ

1. ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋ƒ„.

2. ์„œ๋ฒ„์˜ ์‘๋‹ต์ด ์™”์„ ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญํ•œ Origin ๊ณผ ์‘๋‹ตํ•œ ํ—ค๋”์˜(Access-Control-Request-Headers)์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ
๊ทธ๊ฒƒ์ด ์œ ํšจํ•œ ์š”์ฒญ์ด๋ผ๋ฉด, ๋ฆฌ์†Œ์Šค๋ฅผ ์‘๋‹ตํ•œ๋‹ค.
๋งŒ์•ฝ, ์œ ํšจํ•˜์ง€ ์•Š์€ ์š”์ฒญ์ด๋ผ๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ด๋ฅผ ๋ง‰๊ณ  error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

Simple Request ?

HTTP ๋ฉ”์„œ๋“œ๊ฐ€ GET / POST / HEAD ์ค‘ ํ•˜๋‚˜์ด๊ณ ,

์ž๋™์œผ๋กœ ์„ค์ •๋˜๋Š” ํ—ค๋”๋Š” ์ œ์™ธํ•˜๊ณ , Accept / Accept-Language / Content-Language ์ด ์„ธ๊ฐ€์ง€์˜ ํ—ค๋”๋“ค๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ ,

Content-Type ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ Simple Request ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํ”ํžˆ ์šฐ๋ฆฌ๊ฐ€ fetch('๊ฒฝ๋กœ', {method : 'POST', headers : {Content-Type : 'application/json'}, body : {title}})

์‚ฌ์šฉํ•˜๋Š” ์ด๋Ÿฐ fetch ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์ด์— ํ•ด๋‹นํ•œ๋‹ค.

์ด ์š”์ฒญ์€ ๋”ฐ๋กœ ํ™•์ธ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋ณธ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

 

2. Preflight ์š”์ฒญ์ผ ๊ฒฝ์šฐ

  • Originํ—ค๋”์— ํ˜„์žฌ ์š”์ฒญํ•˜๋Š” origin๊ณผ, Access-Control-Request-Methodํ—ค๋”์— ์š”์ฒญํ•˜๋Š” HTTP method์™€ Access-Control-Request-Headers์š”์ฒญ ์‹œ ์‚ฌ์šฉํ•  ํ—ค๋”๋ฅผ OPTIONS ๋ฉ”์„œ๋“œ๋กœ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋‚ด์šฉ๋ฌผ์€ ์—†์ด ํ—ค๋”๋งŒ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์—์„œ ์‘๋‹ตํ•œ ํ—ค๋”๋ฅผ ๋ณด๊ณ  ์œ ํšจํ•œ ์š”์ฒญ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์œ ํšจํ•˜์ง€ ์•Š์€ ์š”์ฒญ์ด๋ผ๋ฉด ์š”์ฒญ์€ ์ค‘๋‹จ๋˜๊ณ  ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์œ ํšจํ•œ ์š”์ฒญ์ด๋ผ๋ฉด ์›๋ž˜ ์š”์ฒญ์œผ๋กœ ๋ณด๋‚ด๋ ค๋˜ ์š”์ฒญ์„ ๋‹ค์‹œ ์š”์ฒญํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์‘๋‹ต๋ฐ›์Šต๋‹ˆ๋‹ค.

 

preflight ์š”์ฒญ์ด๋ž€?

Simple requests๊ฐ€ ์•„๋‹Œ cross-origin์š”์ฒญ์€ ๋ชจ๋‘ preflight ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € OPTIONS ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ cross-origin HTTP ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์ด๋ฏ€๋กœ ์‚ฌ์ „์— ํ™•์ธ ํ›„ ๋ณธ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

 

์š”์ฒญ ํ—ค๋” ๋ชฉ๋ก

1. Origin

2. Access-Control-Request-Method
preflight ์š”์ฒญ์„ ํ•  ๋•Œ ์‹ค์ œ ์š”์ฒญ์—์„œ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์„œ๋ฒ„์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3. Access-Control-Request-Headers
preflight์š”์ฒญ์„ ํ•  ๋•Œ ์‹ค์ œ ์š”์ฒญ์—์„œ ์–ด๋–ค header๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์„œ๋ฒ„์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

์‘๋‹ต ํ—ค๋” ๋ชฉ๋ก

1. Access-Control-Allow-Origin
๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•ด๋‹น origin์ด ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜น์€ *์€ credentials์ด ์—†๋Š” ์š”์ฒญ์— ํ•œํ•ด์„œ ๋ชจ๋“  origin์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

2. Access-Control-Expose-Headers
๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ํ—ค๋”๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

3. Access-Control-Max-Age
์–ผ๋งˆ๋‚˜ ์˜ค๋žซ๋™์•ˆ preflight์š”์ฒญ์ด ์บ์‹ฑ ๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

4. Access-Control-Allow-Credentials
Credentials๊ฐ€ true ์ผ ๋•Œ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

preflight์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ GET ์š”์ฒญ์€ preflight๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ž๊ฒฉ ์ฆ๋ช…์ด ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๋ฉด ํ—ค๋”๊ฐ€ ๋ฆฌ์†Œ์Šค์™€ ํ•จ๊ป˜ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‘๋‹ต์„ ๋ฌด์‹œํ•˜๊ณ  ์›น ์ฝ˜ํ…์ธ ๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

5. Access-Control-Allow-Methods
preflight`์š”์ฒญ์— ๋Œ€ํ•œ ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ํ—ˆ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

6. Access-Control-Allow-Headers
preflight์š”์ฒญ์— ๋Œ€ํ•œ ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์‹ค์ œ ์š”์ฒญ ์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” HTTP ํ—ค๋”๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

#headers #CORS #simple_request #preflight #content_type #application_json

'CS > ๋ณด์•ˆ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[CS] : ์ฟ ํ‚ค์™€ ์„ธ์…˜  (0) 2023.08.28
[๋ณด์•ˆ] : .ENV ์ ์šฉํ•˜๊ธฐ  (0) 2023.07.20