์น ํ๋ก๊ทธ๋๋ฐ์์, ํนํ ํ๋ก ํธ์์ CORS ๋ฌธ์ ๊ฐ ์ข ์ข ๋ฐ์ํ๋ค. ์ด๋ ๋ก์ปฌ์์ ํ์ธ์ ํ ๋์๋, Postman์ผ๋ก ์์ฒญ์ ๋ณด๋ผ ๋์๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ค๊ฐ, ํ๋ก ํธ์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์์ฒญ์ ๋ณด๋ผ ๋๋ฉด ๋ฐ์ํ๋ ๋ฌธ์ ์ด๊ธฐ์ ์ฒ์ ์ง๋ฉดํ๋ฉด ๋นํฉ์ค๋ฌ์ธ ์ ์๋ ๋ฌธ์ ์ด๋ค. ์ด๋ฌํ CORS ์๋ฌ๊ฐ ์ ๋ฐ์ํ๋์ง, CORS๋ ๋ฌด์์ธ์ง ์ ๋๋ก ์์๋ณด์! ๐
CORS(Cross-Origin Resource Sharing)์ ๊ฐ๋ ์ ์ดํดํ๊ธฐ ์ํด์๋, ์ฐ์ Origin(์ถ์ฒ)์ด ๋ฌด์์ธ์ง ์์์ผ ํ๋ค :)
์ฐ๋ฆฌ๊ฐ ํ์ ์ ๊ทผํ๋ URL์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์๋ค..

์์ ๊ตฌ์ฑ์์ ์ค์์ Protocol + Host + Port ์ด ์ ์ ํฉ์น ๋ถ๋ถ์ Origin, ์ถ์ฒ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด ๋ถ๋ถ์ด ๊ฐ์ผ๋ฉด ๋์ผ ์ถ์ฒ(Same-Origin), ๋ค๋ฅด๋ฉด ๋ค๋ฅธ ์ถ์ฒ(Cross-Origin)๋ผ ํ๋ ๊ฒ์ด๋ค.
์๋ก ์ถ์ฒ๊ฐ ๋ค๋ฅธ (Cross-Origin) ์น์ฌ์ดํธ ๊ฐ์ ์์ฒญ์ ์๊ฐ๋ณด๋ค ํฐ ์ํ์ฑ์ ์ง๋๋ค. ์ด๋ ๋์ผ ์ถ์ฒ ์ ์ฑ (SOP)์ด ์กด์ฌํ๋ ์ด์ ์ด๊ธฐ๋ ํ๋ค. ๊ทธ๋ ๋ค๋ฉด, ๋ค๋ฅธ ์ถ์ฒ์ ์์ฒญ์ ์ ์ํํ ๊น? ๋์ผ ์ถ์ฒ ์ ์ฑ ์ด ์ ํ์ํ ๊ฑธ๊น?
์ฐ์ ์์๋ ๊ฒ์, SOP : ๋์ผ ์ถ์ฒ ์ ์ฑ
์ด๋, ๋์ผํ ์ถ์ฒ์ ์นํ์ด์ง ์ฌ์ด์์๋ง ์์ฒญ์ ํ ์ ์๋๋ก ์ ํํ๋ ์ ์ฑ
์ด๋ค.
์ดํด๋ฅผ ์ํด ์ฝ๊ฒ ์๊ธฐํ์๋ฉด, '์ ๋ขฐํ๋ ๊ณณ'์ผ๋ก๋ถํฐ '์ ๋ขฐํ์ง ์๋ ๊ณณ'์ผ๋ก ๋ณด๋ด๋ ์์ฒญ์ ๋ด ์ปดํจํฐ์ '๋ธ๋ผ์ฐ์ '๊ฐ ๋ง๋ ๊ฒ์ด๋ค.
์ง๋๋ฒ์ ์ดํด๋ณธ ์ฟ ํค/์ธ์ /ํ ํฐ์ ๋ด์ฉ์ ์กฐ๊ธ ์ง์ด๋ณด์. ์ฐ๋ฆฌ๊ฐ ์์ ํ ์นํ์ด์งA์ ๋ก๊ทธ์ธํ๋ฉด, ๋งค๋ฒ ๋ค์ ๋ก๊ทธ์ธํด์ผ ํ๋ ์ด์ํ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฐ๋ฆฌ ์ปดํจํฐ์ ๋ธ๋ผ์ฐ์ ๋ ์ฟ ํค์ ํํ๋ก ์ฐ๋ฆฌ์ ์ ๋ณด๋ฅผ ์ ์ฅํด ๋์๋ค๊ฐ ์์ฒญ ์ ํจ๊ป ๋ณด๋ธ๋ค.
์ด ์ ์ด ์ค์ํ๋ค. ์ฐ๋ฆฌ์ ๋ธ๋ผ์ฐ์ ๋ ์ค์ํ '๋ก๊ทธ์ธ ์ ๋ณด'๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ง์ฝ '์ ๋ขฐํ์ง ์๋ ์นํ์ด์งB'์ ๋ฐฉ๋ฌธํ๋ค๊ฐ (์ด ์น ํ์ด์ง๊ฐ ์ ์๋ฅผ ๋๊ณ ๋ง๋ ๊ฒ์ผ ๊ฒฝ์ฐ) ๋ธ๋ผ์ฐ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ๊ฐ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํด๋ฒ๋ฆฌ๋ ๋ถ์์ฌ๊ฐ ์ผ์ด๋ ์ ์๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ์ด ๋ฐ๋ก ๋์ผ ์ถ์ฒ ์ ์ฑ ์ด๋ค!
๋์ผ ์ถ์ฒ ์ ์ฑ (Same-origin policy)์ ๋ธ๋ผ์ฐ์ ์ ์ ์ฑ ์ค ํ๋๋ก, ๋ค๋ฅธ ์ถ์ฒ๋ก๋ถํฐ ์กฐํ๋ ์์๋ค์ ์ฝ๊ธฐ ์ ๊ทผ์ ๋ง์ ๋ค๋ฅธ ์ถ์ฒ ๊ณต๊ฒฉ์ ์๋ฐฉํ๋ค.
์์ฒญํ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ๋ฐ๋ ์๋ฒ๊ฐ ๊ฐ์ ์ถ์ฒ์ ์์ผ๋ฉด ๋์ผ ์ถ์ฒ, ์๋ก ๋ค๋ฅธ ์๋ฒ์ ์์ผ๋ฉด ๋ค๋ฅธ ์ถ์ฒ ์์ฒญ์ด๋ค.
์ฆ, ํ๋ก ํธ-๋ฐฑ์ด ๊ฐ๊ฐ front-tino.com / back-tino.com์ ๋๋ฉ์ธ์ ๊ฐ์ง ๋ front-tino.com์์ back-tino.com์ ์์ฒญ์ ๋ณด๋ด๋ฉด ์ด๊ฒ์ ๋ค๋ฅธ ์ถ์ฒ ์์ฒญ์ ํด๋นํ๋ ๊ฒ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋์ผ ์ถ์ฒ ์์ฒญ๋ง ์์ ๋กญ๊ฒ ์์ฒญ์ด ๊ฐ๋ฅํ๊ธฐ์ ๊ฐ๊ฐ์ด ์๋ฌด๋ฐ ์ค์ ์ ํด๋์ง ์๋๋ค๋ฉด ์์ฒ๋ผ ํ๋ก ํธ์์ ๋ฐฑ์ ์์ฒญํ๋ ๊ฒ์ CORS error๊ฐ ๋ฐ์ํ๋ฉฐ ์์ฒญ์ ์คํจํ๋ค.
โจ
๊ทธ๋ฌ๋, ์ ์ฐจ ์ธํฐ๋ท์ด ๋ฐ์ ํ๊ณ ํ ์ถ์ฒ์์ ๋ค๋ฅธ ์ถ์ฒ์ ์์์ ํ์๋ก ํ๋ ์ํธ์ ๊ด๊ณ๊ฐ ๋ฐ์ ํ๋ฉด์ SOP๋ ๋ง์ ๋ถํธ์ ์ผ๊ธฐํ๋ค. ์ด๋๋ฌธ์ ์๋กญ๊ฒ ์๊ฒจ๋ ๋ธ๋ผ์ฐ์ ์ ์ ์ฑ
์ด CORS์ด๋ค.
CORS(Cross-Origin Resource Sharing)๋ ์ถ์ฒ๊ฐ ๋ค๋ฅธ ์์๋ค์ ๊ณต์ ํ๋ค๋ ๋ป์ผ๋ก, ํ ์ถ์ฒ์ ์๋ ์์์์ ๋ค๋ฅธ ์ถ์ฒ์ ์๋ ์์์ ์ ๊ทผํ๋๋ก ํ๋ ๊ฐ๋ ์ด๋ค.
์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ, SOP๋ก ์ธํด '๋์ผ ์ถ์ฒ ๋ด์ ์์ฒญ'์ผ๋ก๋ง ์ ํ๋๋ ์์ฒญ์ ๋ํด ๊ทธ ์ ํ์ ํ์ด์ฃผ๋ ๊ฒ์ด CORS์ด๋ค.
(+) ์ฒ์์๋ CORS ์๋ฌ๋ฅผ ๋ณด๊ณ , CORS๊ฐ ์ ๊ทผ์ ๋ง๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ, ์คํ๋ ค SOP๊ฐ ์ ๊ทผ์ ๋ง๊ณ CORS๊ฐ ๊ทธ๊ฒ์ ์ผ๋ถ ํ์ด์ฃผ๋ ๊ฒ์ด์๋ค...!
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฆฌ์์ค๊ฐ ์์ ์ ์ถ์ฒ(๋๋ฉ์ธ+ํ๋กํ ์ฝ+ํฌํธ)์ ๋ค๋ฅผ ๋ ๊ต์ฐจ ์ถ์ฒ HTTP ์์ฒญ์ ์คํํ๋ค. ์ด๋ ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํด ๋ธ๋ผ์ฐ์ ์ ์๋ฆฐ๋ค.
๋จ์ ์์ฒญ์ ์๋ฒ์ ๋ฐ๋ก ์์ฒญ์ ๋ณด๋ธ ํ, ์๋ฒ๊ฐ ์๋ต ํค๋์ Access-Contorol-Allow-Origin๊ณผ ๊ฐ์ ๊ฐ์ ๋ณด๋ด๋ฉด ๊ทธ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ CORS ์ ์ฑ
์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ ๋ฐฉ์์ด๋ค.

์๋น ์์ฒญ์ ์๋ตํ ์ ์๋ Simple Request๋ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
-> ํ์ง๋ง ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ๊ฒ ๋๋ฉด ๊ฑฐ์ ์ถฉ์กฑ์ํค๊ธฐ ์ด๋ ค์ด ์กฐ๊ฑด๋ค์ด๋ฏ๋ก, ์ฌ์ค์ Simple Request์ ๊ฒฝ์ฐ๋ ๋ณด๊ธฐ ์ด๋ ต๋ค.
์ผ๋ฐ์ ์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ผ ๋ ๊ฐ์ฅ ๋ง์ด ๋ง์ฃผ์น๋ ์ํฉ์ผ๋ก, ์ด ์ํฉ์์ ๋ธ๋ผ์ฐ์ ๋ ์์ฒญ์ ํ ๋ฒ์ ๋ณด๋ด์ง ์๊ณ ์๋น ์์ฒญ๊ณผ ๋ณธ ์์ฒญ์ผ๋ก ๋๋์ด์ ์๋ฒ๋ก ์ ์กํ๋ค.
๋ณธ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ๋ณด๋ด๋ ์๋น ์์ฒญ์ Prefilght๋ผ๊ณ ํ๋ฉฐ, ์๋น ์์ฒญ์๋ HTTP ๋ฉ์๋ ์ค OPTIONS ๋ฉ์๋๊ฐ ์ฌ์ฉ๋๋ค. ์๋น ์์ฒญ์ ์ญํ ์ ๋ณธ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ๋ธ๋ผ์ฐ์ ์ค์ค๋ก ์ด ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด ์์ ํ์ง ํ์ธํ๋ ๊ฒ์ด๋ค.

JavaScript์์ ๋ธ๋ผ์ฐ์ ์๊ฒ ๋ฆฌ์์ค๋ฅผ ๋ฐ์์ค๋ ๋ช ๋ น์ ๋ด๋ฆฌ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์๊ฒ ์๋น ์์ฒญ(OPTIONS)์ ๋จผ์ ๋ณด๋ธ๋ค.
OPTIONS ์์ฒญ์ ๋ฐ์ ์๋ฒ๋ Response Header์ ์๋ฒ๊ฐ ํ์ฉํ ์ต์ ์ ์ค์ ํ์ฌ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ ๋ฌํ๋ค.
์๋ฅผ ๋ค์ด ์๋ต ํค๋์ Access-Control-Allow-Origin ํญ๋ชฉ์ ์ถ๊ฐํ์ฌ ํ์ฉํ ๋๋ฉ์ธ์ ์ง์ ํ ์ ์๋๋ฐ, ์ค์ ํ๊ฒ ๋๋ฉด ๊ฐ๋ฐ์ ๋๊ตฌ์์ ์๋์ ๊ฐ์ด ํ์ธํ ์ ์๋ค.
Access-Control-Allow-Origin: https://example.com
๋ธ๋ผ์ฐ์ ๋ ์๋ฒ๊ฐ ๋ณด๋ธ Response ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ํ์ฉ๋์ง ์์ ์์ฒญ์ธ ๊ฒฝ์ฐ 405 Method Not Allowed ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ , ์ค์ ํ์ด์ง์ ์์ฒญ(๋ณธ ์์ฒญ)์ ์๋ฒ๋ก ์ ์กํ์ง ์๋๋ค.
๋ฐ๋๋ก ํ์ฉ๋ ์์ฒญ์ธ ๊ฒฝ์ฐ, ๋ค์ ๋ณธ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฒ๊ฐ ๋ณธ ์์ฒญ์ ๋ํ ์๋ต์ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ต์ข ์ ์ผ๋ก ์๋ต ๋ฐ์ดํฐ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋๊ฒจ์ค๋ค.
๋ ๋ค๋ฅธ ์๋๋ฆฌ์ค๋, ํค๋์ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ์ ๋ณด(์ฟ ํค, ํ ํฐ ๋ฑ)๋ฅผ ๋ด์์ ๋ณด๋ด๋ Credential Request (์ธ์ฆ๋ ์์ฒญ)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๋ CORS์ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์์ด๋ผ๊ธฐ ๋ณด๋ค๋ ๋ค๋ฅธ ์ถ์ฒ ๊ฐ ํต์ ์์ ์ข ๋ ๋ณด์์ ๊ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์๋ฒ๋ก ์ฟ ํค๋ฅผ ํจ๊ป ์ ์กํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ์์ฒญ์ ์ฟ ํค๊ฐ ๋ด๊ธฐ๊ฒ ๋๋ฉด Credentialed Request ํ์ฉ์ด ๋์ด ์์ด์ผ ํ๋ค.
์ฆ, ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๊ฒ ํด์ฃผ๋ ์ต์ 'credentials'๋ฅผ ์ค์ผํ๋๋ฐ, ์ด ๋ ์๋ฒ ์ชฝ์์ ์๋ต ํค๋์ Access-Control-Allow-Credentials: true๋ฅผ ๋ณด๋ด์ฃผ์ง ์๋๋ค๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์๋ต์ ๋ฐ๋ ๊ฒ์ ๊ฑฐ๋ถํ๊ฒ ๋๋ค.
์ด ์ต์ ์๋ ์ด 3๊ฐ์ง์ ๊ฐ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๊ฐ ๊ฐ๋ค์ด ๊ฐ์ง๋ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
| ์ต์ ๊ฐ | ์ค๋ช |
|---|---|
| same-origin(๊ธฐ๋ณธ๊ฐ) | ๊ฐ์ ์ถ์ฒ ๊ฐ ์์ฒญ์๋ง ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค |
| include | ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค |
| omit | ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ง ์๋๋ค |
๋ง์ฝ same-origin์ด๋ include์ ๊ฐ์ ์ต์
์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๊ฐ ํฌํจ๋๋ค๋ฉด, ์ด์ ๋ธ๋ผ์ฐ์ ๋ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ ๋จ์ํ Access-Control-Allow-Origin๋ง ํ์ธํ๋ ๊ฒ์ด ์๋๋ผ ์ข ๋ ๋นก๋นกํ ๊ฒ์ฌ ์กฐ๊ฑด์ ์ถ๊ฐํ๊ฒ ๋๋ค.
์์ฒญ์ ์ธ์ฆ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋ ์ํ์์ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ฒ ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ CORS ์ ์ฑ ์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ ๋ฃฐ์ ๋ค์ ๋ ๊ฐ์ง๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋ค.
Access-Control-Allow-Origin์๋ * (์์ผ๋์นด๋)๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ช
์์ ์ธ URL์ด์ด์ผํ๋ค.
(https://foo.com๊ณผ ๊ฐ์ด ๊ตฌ์ฒด์ ์ธ origin์ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.)
์๋ต ํค๋์๋ ๋ฐ๋์ Access-Control-Allow-Credentials: true๊ฐ ์กด์ฌํด์ผํ๋ค.
SpringBoot์ ๊ฐ์ด ์ผ๋ถ ํ๋ ์์ํฌ๋ ๊ฐ๋ฐ์๊ฐ cross-origin์ ์ฝ๋ ๋จ ๋ช์ค๋ง์ผ๋ก ์ฝ๊ฒ ์ค์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. SpringBoot์์๋ ์ด๋ป๊ฒ ์ค์ ํ๊ณ ์ฌ์ฉํ ์ ์๋์ง ์์๋ณด์.
๋ฉ์๋ ์ค์ , ์ปจํธ๋กค๋ฌ ์ค์ ์ด ์์ผ๋ฉฐ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฉ ํ ์๋ ์๋ค.
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@RequestMapping(method = RequestMethod.GET, path = "/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
retrieve() ๋ฉ์๋์ ์ ์ธ๋ @CrossOrigin์ ๊ธฐ๋ณธ ์ค์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๋ชจ๋ ์ถ์ฒ๊ฐ ํ์ฉ๋๋ค.
2. ํ์ฉ๋ HTTP ๋ฉ์๋๋ @RequestMapping์ ์ ์ธ๋ ๋ฉ์๋๋ค์ด๋ค.
3. ํ๋ฆฌํ๋ผ์ดํธ ์๋ต์ 30๋ถ ๋์ ์บ์๋๋ค.
@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@RequestMapping(method = RequestMethod.GET, path = "/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
์ปจํธ๋กค๋ฌ์ ์ค์ ํ์ผ๋ฏ๋ก AccountController์ ์๋ retrieve() ์ remove() ํจ์ ๋ชจ๋์ ์ ์ฉ๋๋ค.
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin("http://example.com")
@RequestMapping(method = RequestMethod.GET, "/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
์คํ๋ง์์ ์ฌ๋ฌ๊ฐ์ง CORS ์ ์ฑ ์ ๋ณตํฉํด์ ์ค์ ํ ์ ์๋ค.
๋ชจ๋ ๋ฉ์์๋๋ค์ 3600์ด๊ฐ ์บ์ ์๊ฐ์ด๋ค. retrieve() ๋ฉ์๋๋ ํ์ฉ ์ถ์ฒ๊ฐ "http://example.com" ๋ฐ์ ์๋๋ค. ํ์ง๋ง, remove() ๋ฉ์๋๋ ๋ณ๋์ ์ค์ ์ด ์์ผ๋ฏ๋ก ๋ชจ๋ ์ถ์ฒ๊ฐ ๊ฐ๋ฅํ๋ค.
CORS ์ ์ฑ ์ ์ค์ ์ WebMvcConfigurer๋ฅผ ๊ตฌํํ์ฌ ์ค์ ํ ์ ์๋ค. ์ด๋ ํํฐ ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์, ์ ์ญ์ ์ผ๋ก ๋ชจ๋ ์์ฒญ์ ๋ํด์ ๊ฒ์ฌํ๋ค.
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}
์๋์์, ํ๋ก ํธ์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์์ฒญ์ ๋ณด๋ผ ๋๋ฉด ๋ฐ์ํ๋ CORS์ ๋ํด์ ์ธ๊ธํ์๋ค.
CORS์ ๊ฐ๋ ์ ์ดํดํ๊ณ ์๊ฐ์ ๋ฐ๊พธ๊ฒ ๋ ๊ฒ์, CORS๋ ์์ฒญ์ ๋ง๋ ์ ์ฑ ์ด ์๋๋ผ ์คํ๋ ค SOP(๋์ผ ์ถ์ฒ ์ ์ฑ )๊ฐ ์ ํํด๋ ์์ฒญ์ ํ์ด์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด CORS ์ ์ฑ ์ด๋ผ๋ ์ฌ์ค์ด๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, CORS ๋ฌธ์ ์ ๋ง๋ฅ๋จ๋ฆด ๊ฒฝ์ฐ ์์์ ๋ค๋ฃฌ cross-origin ์ค์ ์ผ๋ก ํด๊ฒฐํ๋ฉด ๋๋ค! ๐ค
๐ ์ ๋ฆฌํ๊ธฐ
CORS๋ ๋ธ๋ผ์ฐ์ ์ ์ ์ฑ
์ค ํ๋๋ก, SOP๋ก ์ ํ๋ '๋ค๋ฅธ ์ถ์ฒ ์์ฒญ'์ ๋ํด ๊ทธ ์ ํ์ ํ์ด์ฃผ๋ ์ ์ฑ
์ด๋ค. ์ฆ, ๋ค๋ฅธ ์ถ์ฒ Cross-Origin ์ฌ์ด์ ์์ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋๋ก ํ๋ ์ ์ฑ
์ด๋ค.