CS Visualized: โ๐ผ๐ฅ CORS
Posted on September 03, 2020ย - ย 7 min readreference: https://dev.to/lydiahallie/cs-visualized-cors-5b8h
๋ชจ๋ ๊ฐ๋ฐ์๋ค์ด ํ ๋ฒ์ฏค์ ์ฝ์์์ ๋นจ๊ฐ์ ์๋ฌ์ธ Access to fecthed has been blocked by CORS policy
๋ฅผ ๋ณด๊ณ ๋ต๋ตํจ์ ๊ฐ์ก์ ๊ฑฐ์์! ๐ฌ ์ด ์๋ฌ๋ฅผ ๋น ๋ฅด๊ฒ ์ ๊ฑฐํ ์ ์๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ง๋ง ๊ทธ๋ฐ ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ค์ ํ๋ ๋์ , CORS๊ฐ ์ค์ ๋ก ํ๋ ๊ฒ์ด ๋ฌด์์ด๊ณ ์ค์ ๋ก๋ ๊ทธ๊ฒ์ด ์ ์ฐ๋ฆฌ์๊ฒ ๋์์ด ๋๋์ง ์์๋ณด๋๋ก ํ์ฃ ๐๐ผ
โ๏ธ ์ด๋ฒ ํฌ์คํธ์์๋ HTTP์ ๊ธฐ๋ณธ์ ๋ํด์๋ ์ค๋ช ํ์ง ์์ต๋๋ค. ํน์ ์ฌ๋ฌ๋ถ๋ค์ด HTTP ์์ฒญ๊ณผ ์๋ต์ ๋ํด ๋ ์๊ณ ์ถ์ผ์๋ค๋ฉด, ์ ๊ฐ ์ผ๋ง ์ ์ ๊ฐ๋จํ๊ฒ ์์ฑํ ๊ฒ์๋ฌผ์ ๋ด์ฃผ์ธ์. ๐ ์ด๋ฒ ์์๋ HTTP/2๊ฐ ์๋ HTTP/1.1๋ก ์์ฑ๋์์ง๋ง CORS์๋ ๋ฌด๊ดํฉ๋๋ค.
ํ๋ก ํธ์๋์์๋ ์ข ์ข ๋ค๋ฅธ ๊ณณ์ ์์นํ ๋ฐ์ดํฐ๋ฅผ ํ์ํด์ผํ ๋๊ฐ ์์ฃ ! ์ด๋ฐ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ธฐ ์ ์, ๋ธ๋ผ์ฐ์ ๋ ๋จผ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์๋ฒ์ ์์ฒญ์ ํด์ผํฉ๋๋ค! ํด๋ผ์ด์ธํธ๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋๋ ค์ฃผ๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ์ ๋ณด๋ค์ HTTP ์์ฒญ์ ์ค์ด ๋ณด๋ ๋๋ค. ๐
api.website.com
์ด ์์นํ ์๋ฒ์์ www.mywebsite.com
์น ์ฌ์ดํธ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ๋ค๊ณ ํด๋ณด์ฃ !
์๋ฒฝํฉ๋๋ค! ๐ ๋ฐฉ๊ธ HTTP ์์ฒญ์ ์๋ฒ๋ก ๋ณด๋ธ ๋ค, ์ฐ๋ฆฌ ์์ฒญํ JSON ๋ฐ์ดํฐ๋ฅผ ์๋ต๋ฐ์์ต๋๋ค.
์ด์ ์ ํํ ๋๊ฐ์ ์์ฒญ์ ๋ค๋ฅธ ๋๋ฉ์ธ์์ ์คํํ๋ค๊ณ ํด๋ณด์ฃ . www.mywebsite.com
์์ ์์ฒญ์ ๋ง๋๋ ๋์ , ์ด์ www.anotherdomain.com
์์ ์์ฒญ์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
์ ๊น, ๋ญ์ฃ ? ์ฐ๋ฆฐ ์์ ํ ๋์ผํ ์์ฒญ์ ๋ณด๋๋๋ฐ ์ด๋ฒ์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด์ํ ์๋ฌ๋ฅผ ๋ณด์ฌ์ฃผ๋ค์? ์ฐ๋ฆฐ ๋ฐฉ๊ธ CORS๋ฅผ ์ค์ ๋ก ๋ณธ ๊ฒ์ ๋๋ค ๐ช๐ผ ์ด์ ์ ์ด ์๋ฌ๊ฐ ๋ฐ์ํ๋์ง ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๊ฐ ๋ฌด์์ธ์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
โ๐ผ ๋์ผ ์ถ์ฒ ์ ์ฑ (Same-Origin Policy)
์น์ ๋์ผ ์ถ์ฒ ์ ์ฑ (same-origin policy)๋ผ๋ ๊ฒ์ ์ํํ๊ณ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, ์ฐ๋ฆฌ๋ ์์ฒญ๊ณผ ๋์ผํ ์ถ์ฒ์ ์์นํ ๋ฆฌ์์ค๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค! ๐ช๐ผ
์๋ฅผ ๋ค์ด, https://mywebsite.com/image1.png
์ ์์นํ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ ๊ฑด ๊ด์ฐฎ๋ค๋๊ฑฐ์ฃ .
๋ฆฌ์์ค๊ฐ ๋ค๋ฅธ (์๋ธ)๋๋ฉ์ธ, ํ๋กํ ์ฝ ๋๋ ํฌํธ์ ์์นํ ๊ฒฝ์ฐ๋ฅผ ๊ต์ฐจ ์ถ์ฒ(cross-origin)์ด๋ผ๊ณ ํฉ๋๋ค!
๋ฉ์์ด๋ณด์ด์ง๋ง, ๋์ผ ์ถ์ฒ ์ ์ฑ ์ด ์กด์ฌํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น์?
๋์ผ ์ถ์ฒ ์ ์ฑ ์ด ์๊ณ , ์ฌ๋ฌ๋ถ๋ค์ ์ด๋ชจ๊ฐ Facebook์์ ๋ณด๋ธ ๋ง์ ๋ฐ์ด๋ฌ์ค ๋งํฌ ์ค ํ๋๋ฅผ ํด๋ฆญํ๋ค๊ณ ํด๋ณด์ฃ . ์ด ๋งํฌ๋ ์ฌ๋ฌ๋ถ๋ค์ ์ํ ์น ์ฌ์ดํธ๊ฐ iframe์ผ๋ก ๋ก๋๋๋ ์ ์์ ์ธ ์น ์ฌ์ดํธ๋ก ๋ฆฌ๋ค์ด๋ ์ ํ๊ฒ ๋๊ณ , ์ผ๋ถ ์ฟ ํค๋ฅผ ์ฌ์ฉํด์ ๋ก๊ทธ์ธ์ ์ฑ๊ณต์ ์ผ๋ก ์ํํ๊ฒ ๋๊ฒ ์ฃ ! ๐ฌ
์ด๋ฐ ์ ์์ ์ธ ์น ์ฌ์ดํธ์ ๊ฐ๋ฐ์๋ค์ ์น ์ฌ์ดํธ๊ฐ ์ฌ๋ฌ๋ถ๋ค์ ๋์ ํ์ฌ ์์ ์ ๊ณ์ข๋ก ๋์ ๋ณด๋ด๋๋ก ํ๊ธฐ ์ํด iframe์ผ๋ก ์ํ ์น ์ฌ์ดํธ์ DOM ์ปจํ ์ธ ์ ์ํธ์์ฉ์ ํ ์ ์๊ฒ ํ ๊ฑฐ์์!
๋ค..์์ฒญ๋ ๋ณด์ ๋ฆฌ์คํฌ์ฃ ! ์ฐ๋ฆฐ ๋๊ตฌ๋ ๋ชจ๋ ๊ฒ์ ์ ๊ทผํ ์ ์๊ธฐ๋ฅผ ์ํ์ง ์์์ ๐ง
๋คํ์ค๋ฝ๊ฒ๋, ๋์ผ ์ถ์ฒ ์ ์ฑ ์ด ์ฐ๋ฆฌ๋ฅผ ๋์์ค๋๋ค! ์ด ์ ์ฑ ์ ๊ฐ์ ์ถ์ฒ์์๋ง ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ์ธํด์ค๋๋ค.
์ด๋ฒ์๋ www.evilwebsite.com
์ด๋ ์ถ์ฒ๊ฐ www.bank.com
์ ๊ต์ฐจ ์ถ์ฒ ์์์ ์ ๊ทผํ๋ ค๊ณ ํฉ๋๋ค! ๋์ผ ์ถ์ฒ ์ ์ฑ
์ด ์ด๋ฐ ์์ฒญ์ ๋ง์์ฃผ๊ณ ์
์์ ์ธ ์น ์ฌ์ดํธ์ ๊ฐ๋ฐ์๊ฐ ์ฐ๋ฆฌ์ ์ํ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํด์ค๋๋ค ๐ฅณ
์ข์์, ๊ทผ๋ฐ ์ด๊ฒ์ด CORS์ ๋ฌด์จ ๊ด๊ณ๊ฐ ์๋๊ฑธ๊น์?
๐ฅ ํด๋ผ์ด์ธํธ ์์ญ์ ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Client-side CORS)
๋์ผ ์ถ์ฒ ์ ์ฑ ์ด ์ค์ ๋ก๋ ์คํฌ๋ฆฝํธ์๋ง ์ ์ฉ๋์ง๋ง ๋ธ๋ผ์ฐ์ ๋ ์ด ์ ์ฑ ์ JavaScript์ ์์ฒญ๊น์ง โํ์ฅโํฉ๋๋ค: ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ ์ถ์ฒ์์ ๊ฐ์ ธ์จ ๋ฆฌ์์ค์๋ง ์ ๊ทผํ ์ ์์ต๋๋ค!
ํ , ๊ทธ๋ฐ๋ฐโฆ์ฐ๋ฆฐ ์ข ์ข ๊ต์ฐจ ์ถ์ฒ์ ์์๋ค์ ์ ๊ทผํด์ผ ํ ๋๊ฐ ์์ฃ ๐ค ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ธฐ ์ํด ํ๋ก ํธ์๋๊ฐ ๋ฐฑ์๋ API์ ์ํธ์์ฉ์ ํ ๋๊ฐ ์๋ค๋ฉด์? ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๋ CORS๋ผ๊ณ ํ๋ ๋งค์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค! ๐ฅณ
CORS๋ ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing)์ ์ฝ์์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ๋์ผํ ์ถ์ฒ์ ์์นํ์ง ์์ ๋ฆฌ์์ค์ ์ ๊ทผ์ ํ๋ฝํ์ง ์๋๋ผ๋, ์ฐ๋ฆฌ๋ CORS๋ฅผ ํตํด ํด๋น ๋ณด์์ ์ ์ฝ์ ์ฝ๊ฐ ๋ณ๊ฒฝํ์ฌ ํด๋น ๋ฆฌ์์ค์ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค ๐
์ฌ์ฉ์ ์์ด์ ํธ (์: ๋ธ๋ผ์ฐ์ )๋ CORS ๋งค์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ HTTP ์๋ต์ ํน์ ํ CORS ๊ด๋ จ ํค๋ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ฐจ๋จ๋ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ํ์ฉํ ์ ์์ต๋๋ค! โ
๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ด ์ด๋ฃจ์ด์ง๋ฉด, ํด๋ผ์ด์ธํธ๋ ์๋์ ์ผ๋ก ์ถ๊ฐ ํค๋๋ฅผ HTTP ์์ฒญ์ ๋ง๋ถ์
๋๋ค: Origin
์ด์ฃ . Origin
ํค๋์ ๊ฐ์ ์์ฒญ์ ์ด๋์์ ํ๋์ง๋ฅผ ๋ํ๋ด๋ ์ถ์ฒ์
๋๋ค!
๋ธ๋ผ์ฐ์ ๊ฐ ๊ต์ฐจ ์ถ์ฒ์ ์์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ํ๊ธฐ ์ํด, ์๋ฒ ์๋ต์์ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ํ์ฉํ๋์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ํน์ ํค๋๊ฐ ๋์ด์ค๊ธธ ๊ธฐ๋ค๋ฆฝ๋๋ค!
๐ป ์๋ฒ ์์ญ์ ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Server-side CORS)
์๋ฒ ๊ฐ๋ฐ์๋ Access-Control-*
๋ก ์์ํ๋ ๊ฒ๋ค์ HTTP ์๋ต์ ์ถ๊ฐ ํค๋๋ฅผ ๋ง๋ถ์ฌ ์ฃผ์ด ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ํ๋ฝํ ์ ์๊ฒ ๋ฉ๋๋ค. ๐ฅ ์ด๋ฌํ CORS ์๋ต ํค๋์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ ์ด์ ๋์ผ ์ถ์ฒ ์ ์ฑ
์ ์ํด ์ฐจ๋จ๋ ๊ต์ฐจ ์ถ์ฒ ์๋ต ์ค ํน์ ํ ๊ฒ๋ค์ ํ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค!
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง์ CORS ํค๋๋ค์ด ์์ง๋ง, ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค์ ์ ๊ทผ์ ํ์ฉํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ์ ํ์ํ ํค๋๊ฐ ํ๋ ์์ต๋๋ค: Access-Control-Allow-Origin
์ด์ฃ ! ๐ ์ด ํค๋์ ๊ฐ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์๊ฒ ์์ฒญํ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ์ถ์ฒ๋ฅผ ์ง์ ํด์ค๋๋ค.
๋ง์ฝ ์๋ฒ๊ฐ https://mywebsite.com
์์ ์ ๊ทผํ ์ ์๋ ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ, Access-Control-Allow-Origin
ํค๋์ ๊ฐ์ ํด๋น ๋๋ฉ์ธ์ผ๋ก ์ถ๊ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค!
๋๋๋ค์! ๐ ์ด ํค๋๋ ์ด์ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ก ๋๋ ค์ฃผ๋ ์๋ต์ ์ถ๊ฐ๋ฉ๋๋ค. ์ด ํค๋๊ฐ ๋ํด์ง์ผ๋ก์จ, ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ https://mywebsite.com
์์ https://api.mywebsite.com
์ ์์นํ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ณ ๋ฐ๋๋ฐ ๋ ์ด์ ๋์ผ ์ถ์ฒ ์ ์ฑ
์ด ์ ํ์ ๊ฑธ์ง ์์ต๋๋ค!
๋ธ๋ผ์ฐ์ ๋ด์ CORS ๋งค์ปค๋์ฆ์ Access-Control-Allow-Origin
ํค๋์ ๊ฐ์ด ์์ฒญ์ ์ํด ๋ณด๋ด์ง Origin
์ ๊ฐ๊ณผ ๊ฐ์์ง๋ฅผ ํ์ธํ๋ ๊ฒ์ด์ฃ . ๐ค๐ผ
์ด๋ฒ ๊ฒฝ์ฐ, ์์ฒญ์ ์ถ์ฒ๋ https://www.mywebsite.com
์ด๊ณ , ์ด๊ฑด Access-Control-Allow-Origin
์๋ต ํค๋์ ๋ชฉ๋ก์ ์ํด์์ฃ !
์๋ฒฝํ๋ค์! ๐ ์ฐ๋ฆฐ ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์์ ํ ์ ์๊ฒ ๋์์ด์! ๊ทธ๋ผ Access-Control-Allow-Origin
ํค๋์ ๋ชฉ๋ก์ ์ํ์ง ์์ ์ถ์ฒ์ ์์์ ์ ๊ทผํ๋ ค ํ๋ค๋ฉด ์ด๋ค ์ผ์ด ์ผ์ด๋ ๊น์? ๐ค
์์ ๋ค, CORS๋ ๋๋๋ก ์ฐ๋ฆฌ๋ฅผ ๋ต๋ตํ๊ฒ ํ๋ ์ด ์ ๋ช ๋์ ์๋ฌ๋ฅผ ๋์ง์ฃ ! ํ์ง๋ง ์ด์ ์ฐ๋ฆฐ ์ด๊ฑธ ์์ ํ ์ดํดํ ์ ์์ฃ .
The 'Access-Control-Allow-Origin' header has a value
'https://www.mywebsite.com' that is not equal
to the supplied origin.
์ด๋ฒ ๊ฒฝ์ฐ, ์ ๊ณต๋ ์ถ์ฒ๋ https://www.anotherwebsite.com
์ด์ฃ . ํ์ง๋ง ์๋ฒ๋ Access-Control-Allow-Origin
ํค๋ ๋ด ํ์ฉ๋ ์ถ์ฒ์ ๋ชฉ๋ก์ ์ด ์ถ์ฒ๊ฐ ์์ฃ ! CORS๋ ์ด ์์ฒญ์ ์ฑ๊ณต์ ์ผ๋ก ์ฐจ๋จํ๊ณ , ์ฝ๋ ๋ด์์๋ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๊ฒ ๋์ฃ ๐
CORS ๋ํ ํ์ฉ๋ ์ถ์ฒ์ ๊ฐ์ผ๋ก *์ธ ์์ผ๋์นด๋๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด ๋ง์ ๋ชจ๋ ์ถ์ฒ์์ ์์ฒญํ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ค๋ ๊ฒ์ด๋ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค!
Access-Control-Allow-Origin
์ ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ ์ ์๋ ๋ง์ CORS ํค๋ ์ค ํ๋์
๋๋ค. ์๋ฒ ๊ฐ๋ฐ์๋ ์๋ฒ์ ํน์ ์์ฒญ์ ํ์ฉํ์ง ์๊ธฐ ์ํด COS ์ ์ฑ
์ ํ์ฅํ ์ ์์ต๋๋ค! ๐ช๐ผ
๋ณดํต ์ฌ์ฉ๋๋ ๋ ๋ค๋ฅธ ํค๋๋ Access-Control-Allow-Methods
ํค๋์
๋๋ค! CORS๋ ์ง์ ๋ ๋ฉ์๋๋ก ์ ์ก์ด๋ ๊ฒฝ์ฐ์๋ง ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ํ์ฉํ๊ฒ ๋ ๊ฒ๋๋ค.
์ด๋ฒ์๋, GET
, POST
๋๋ PUT
๋ฉ์๋๋ก ์ค๋ ์์ฒญ๋ง ํ๋ฝ๋ฉ๋๋ค! ๋ค๋ฅธ PATCH
๋ DELETE
๊ฐ์ ๋ค๋ฅธ ๋ฉ์๋๋ค์ ์ฐจ๋จ๋ฉ๋๋ค โ
๋ง์ฝ ๋ค๋ฅธ ์ฌ์ฉ ๊ฐ๋ฅํ CORS ํค๋๋ค์ด ๋ฌด์์ธ์ง ๊ถ๊ธํ๊ณ , ์ด๋์ ์ฌ์ฉ๋๋์ง ๊ถ๊ธํ๋ค๋ฉด, ์ด ๋ชฉ๋ก์ ํ์ธํด๋ณด์ธ์.
PUT
, PATCH
๋ฐ DELETE
์์ฒญ์ ๋ํด CORS๋ ์ค์ ๋ก ์ด ์์ฒญ๋ค์ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํฉ๋๋ค! ๐ ์ด๋ฐ โ๋จ์ํ์ง ์์โ ์์ฒญ์ ์ฌ์ ์์ฒญ(preflight request)๋ผ๊ณ ๋ถ๋ฅผ๊ป์!
๐ ์ฌ์ ์์ฒญ(Preflighted Requests)
CORS๋ ์์ฒญ์ ๋ ๊ฐ์ง๋ก ๊ตฌ๋ถํฉ๋๋ค: ๋จ์ ์์ฒญ๊ณผ ์ฌ์ ์์ฒญ์ด์ฃ . ๋จ์ํ์ง ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ง์ ๋ํ ์ฌ๋ถ๋ ์์ฒญ ๋ด์ ์ผ๋ถ ๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค(๊ฑฑ์ ๋ง์์. ์ด๊ฒ๋ค์ ๊ธฐ์ตํ ํ์๋ ์์ด์).
์์ฒญ์ด GET
๋๋ POST
๋ฉ์๋๊ณ ์ฌ์ฉ์ ์ง์ ํค๋๊ฐ ์์ ๊ฒฝ์ฐ ์ด ์์ฒญ์ ๋จ์ ์์ฒญ์
๋๋ค! PUT
, PATCH
๋๋ DELETE
๋ฉ์๋๋ก ์ด๋ค์ง ์์ฒญ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ ์ฒ๋ฆฌ ๋ฉ๋๋ค.
๋ง์ฝ ๋จ์ ์์ฒญ์ ๋ง๋ค๊ธฐ ์ํด ์ด๋ค ์๊ตฌ ์ฌํญ์ด ์ถฉ์กฑ๋์ด์ผ ํ๋์ง ๊ถ๊ธํ๋ค๋ฉด MDN์ ์ ์ฉํ ๋ฆฌ์คํธ๊ฐ ์์ต๋๋ค!
๊ทธ๋ฐ๋ฐ โ์ฌ์ ์์ฒญโ์ด๋ ๋ฌด์์ด๊ณ , ์ ์ด๋ฐ ๊ฒ ์๊ฒผ์๊น์?
์ค์ ์์ฒญ์ด ์ ์ก๋๊ธฐ ์ ์, ํด๋ผ์ด์ธํธ๋ ์ฌ์ ์์ฒญ์ ์์ฑํฉ๋๋ค! ์ฌ์ ์์ฒญ์๋ Access-Control-Request-*
ํค๋์ ์ค์ ์์ฒญ ํ๋ ค๊ณ ํ๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค ๐ฅ
์ด๊ฒ์ ๋ธ๋ผ์ฐ์ ๊ฐ ํ๊ณ ์ ํ๋ ์ค์ ์์ฒญ์ ๋ํ ์๋ฒ์ ์ ๋ณด๊ฐ ์ ๊ณต๋ฉ๋๋ค: ์์ฒญ์ ๋ฉ์๋, ์ถ๊ฐ์ ์ธ ํค๋๋ค ๊ทธ๋ฆฌ๊ณ ๊ธฐํ.
์๋ฒ๋ ์ด ์ฌ์ ์์ฒญ์ ์์ ํ๊ณ ๋น HTTP ์๋ต์ ์๋ฒ์ CORS ํค๋๋ค์ ์ค์ด ๋ณด๋ ๋๋ค! ๋ธ๋ผ์ฐ์ ๋ ๋น ๋ฐ์ดํฐ์ CORS ํค๋๋ค์ด ์๋ ์ฌ์ ์๋ต์ ์์ ํ๊ณ ํ์ฉ๋๋ HTTP ์์ฒญ์ด ๋ฌด์์ธ์ง ํ์ธํฉ๋๋ค! โ
์ด ๊ฒฝ์ฐ, ๋ธ๋ผ์ฐ์ ๋ ์ค์ ์์ฒญ์ ์๋ฒ๋ก ๋ณด๋ด๊ณ , ์์ฒญํ ๋ฐ์ดํฐ๊ฐ ์๋ ์๋ต์ ์์ ํ๊ฒ ๋ฉ๋๋ค!
ํ์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ CORS๋ ์ฌ์ ์์ฒญ์ ์ฐจ๋จํ๊ณ , ์ค์ ์์ฒญ์ ์ ์ก๋์ง ์์ต๋๋ค. โ๐ผ ์ฌ์ ์์ฒญ์ CORS ์ ์ฑ ์ด (์์ง) ์ฌ์ฉ๊ฐ๋ฅํ์ง ์์ ์๋ฒ์ ๋ฆฌ์์ค์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ๋ ๊ฒ์ ๋ง๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค! ์๋ฒ๋ ์ด์ ์ ์ฌ์ ์ผ๋ก ์ํ์ง ์๋ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ผ๋ก๋ถํฐ ๋ณดํธ๋ฉ๋๋ค ๐
๐ก ์๋ฒ์์ ์๋ณต ํ์๋ฅผ ์ค์ด๊ธฐ ์ํด CORS ์์ฒญ์
Access-Control-Max-Age
ํค๋๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ ์๋ต์ ์บ์ํ ์ ์์ต๋๋ค! ์ฌ์ ์๋ต์ ์ด๋ฐ์์ผ๋ก ์บ์ํ๊ฒ ๋๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์๋ก์ด ์ฌ์ ์์ฒญ์ ๋ณด๋ด๋ ๋์ ์ด๊ฒ์ ์ฌ์ฉํฉ๋๋ค!
๐ชย ์๊ฒฉ ์ฆ๋ช (Credentials)
์ฟ ํค, ์ธ์ฆ ํค๋ ๋ฐ TLS ์ธ์ฆ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผ ์ถ์ฒ ์์ฒญ์์๋ง ์ค์ ์ด ๋ฉ๋๋ค! ํ์ง๋ง, ์ด๋ฌํ ์๊ฒฉ ์ฆ๋ช ๋ค์ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์์๋ ์ฌ์ฉํด์ผ ํ ๋๊ฐ ์์ฃ . ์๋ฒ๊ฐ ์ฌ์ฉ์๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ฟ ํค๋ฅผ ์์ฒญ์ ํฌํจ์ํค๊ณ ์ถ์ ์๊ฐ ์์ด์!
CORS๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์๊ฒฉ ์ฆ๋ช
์ ํฌํจํ์ง ์์ง๋ง, ์ฐ๋ฆฐ Access-Control-Allow-Credentials
CORS ํค๋๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋ฅผ ๋ฐ๊ฟ ์ ์์ต๋๋ค! ๐
๋ง์ฝ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ์ฟ ํค ๋ฐ ๋ค๋ฅธ ๊ถํ ํค๋๋ฅผ ํฌํจํ๋ ค๋ฉด, ์์ฒญ์์ withCredentials
ํ๋์ true
๋ฅผ ํ ๋นํ๊ณ Access-Control-Allow-Credentials
ํค๋๋ฅผ ์๋ต์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
์ค์ ์ด ๋ค ๋์ต๋๋ค! ์ด์ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ์๊ฒฉ ์ฆ๋ช ์ ํฌํจํ ์ ์์ต๋๋ค ๐ฅณ
CORS ์๋ฌ๊ฐ ๋๋๋ก ๋ต๋ตํ๋ค๋๋ฐ ๋ชจ๋ ๋์ ํ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์ง๋ง, ๋ธ๋ผ์ฐ์ ์์ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ์์ ํ๊ฒ ๋ง๋ค ์ ์๋ฐ๋ ๊ฒ์ ๋๋ผ์ด ์ผ์ ๋๋ค (๋ถ๋ช ์ฌ๋์ ๋ฐ์์ผ ํ๋ ๊ธฐ๋ฅ์ด์์) โจ
๋น์ฐํ ์ด ํฌ์คํธ์์ ๋ค๋ฃฐ ์ ์๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ๋์ผ ์ถ์ฒ ์ ์ฑ ๊ณผ CORS๊ฐ ์กด์ฌํฉ๋๋ค. ๋คํํ๋, ์ด๊ฒ๋ค์ ๋ํด ๋ ๋ง์ ์ ๋ณด๋ค์ด ์ฌ๊ธฐ๋ W3 ์คํ์ ๋ง์ด ์์ต๋๋ค! ๐ช๐ผ
๋ ๊ทธ๋ ๋ฏ, ์ง๋ฌธ์ ํ์์ ๋๋ค! ๐