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 |