ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ฐ์ ํต์ ์ ํ๋ ค๊ณ ํ ๋ ์ฆ, ํด๋ผ์ด์ธํธ์์ API๋ฅผ ์ง์ ํธ์ถํ ๋ CORS ์ ์ฑ ์๋ฐ์ผ๋ก ์ค๋ฅ๊ฐ ๋๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
CORS๋ "๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ "๋ฅผ ์๋ฏธํ๊ณ , SOP๋ ๊ทธ ๋ฐ๋์ธ "๋์ผ ์ถ์ฒ ์ ์ฑ "์ ์๋ฏธํ๋ค.
"์ถ์ฒ๊ฐ ๊ต์ฐจํ๋ค"๋ ์๋ฏธ๊ฐ ๋ญ๊น?
์ถ์ฒ (Origin)
์ฐ์ CORS์ SOP ๊ณตํต์ผ๋ก Origin(์ถ์ฒ)์ด๋ผ๋ ๋จ์ด๋ฅผ ํฌํจํ๊ณ ์๋ค.
์ถ์ฒ๋ URL์์ ๋๋ฉ์ธ, ํ๋กํ ์ฝ, ํฌํธ๊น์ง ํฌํจํ๋ ๊ฐ๋ ์ผ๋ก ์ด ์ค ํ๋๋ผ๋ ๋ค๋ฅด๊ฒ ๋๋ฉด CORS ์๋ฌ๋ฅผ ๋ง๋๊ฒ ๋๋ ๊ฒ์ด๋ค.
- ๋๋ฉ์ธ (Hostname) : myshop.com
- ์ถ์ฒ (Origin) : https://myshop.com
"์ถ์ฒ๊ฐ ๊ต์ฐจํ๋ค" ๐ ๋ฆฌ์์ค๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ ค๋ '๋ ์ถ์ฒ๊ฐ ์๋ก ๋ค๋ฅด๋ค'๋ฅผ ์๋ฏธ
CORS ์ค์ ๐ "์ถ์ฒ๊ฐ ๋ค๋ฅธ ์๋ฒ ๊ฐ์ ๋ฆฌ์์ค ๊ณต์ "๋ฅผ ํ์ฉ
CORS (Cross-Origin-Resource Sharing, ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ )
๐ ์๋ก ๋ค๋ฅธ ์ถ์ฒ๋ผ๋ ๋ฆฌ์์ค ์์ฒญ๊ณผ ์๋ต ํ์ฉํ ์ ์๋๋ก ํ๋ ์ ์ฑ ์ผ๋ก์ ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ถ์ฒ์ ์์์ ์ ๊ทผ๊ฐ๋ฅํ ๊ถํ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์
ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ฅผ ๋ฐ๋ก ๊ตฌ์ฑํ์ฌ ํด๋ผ์ด์ธํธ์์ API๋ฅผ ์ง์ ํธ์ถํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋น๋ฒํ๋ค.
๋ณดํต ํด๋ผ์ด์ธํธ์ API๋ ๋ค๋ฅธ ๋๋ฉ์ธ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ CORS ์ ์ฑ ์ด ์๊ฒผ๋ค.
์ถ์ฒ๊ฐ ๋ค๋ฅด๋๋ผ๋ ์์ฒญ๊ณผ ์๋ต์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ์๋ฒ์ ๋ฆฌ์์ค ํธ์ถ์ด ํ์ฉ๋ ์ถ์ฒ(Origin)๋ฅผ ๋ช ์ํด์ฃผ๋ฉด ๋๋ค !
๐น ํด๊ฒฐ ๋ฐฉ๋ฒ
- ํ๋ก ํธ : Request Header์ CORS ๊ด๋ จ ์ต์ ์ ๋ฃ๋๋ค.
- ์๋ฒ : Response Header์ ํ๋ก ํธ์ ์์ฒญ์ ํ์ฉํ๋ค๋ ๋ด์ฉ์ ๋ฃ๋๋ค.
๐น ๋์ ๋ฐฉ๋ฒ - ๊ธฐ๋ณธ ํ๋ฆ
- ์น ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์ ์ด HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์์ฒญ ํค๋์ Origin์ด๋ผ๋ ํ๋์ ์์ฒญ์ ๋ณด๋ด๋ ์ถ์ฒ๋ฅผ ํจ๊ป ๋ณด๋ธ๋ค.
- ์๋ฒ๊ฐ ์ด ์์ฒญ์ ๋ํ ์๋ต์ ํ ๋ ์๋ต ํค๋์ Access-Control-Allow-Origin์ด๋ผ๋ ๊ฐ์ "์ด ๋ฆฌ์์ค๋ฅผ ์ ๊ทผํ๋ ๊ฒ์ด ํ์ฉ๋ ์ถ์ฒ"๋ผ๋ ๋ด์ฉ์ ์ค์ด๋ณด๋ธ๋ค.
- ์๋ต์ ๋ฐ์ ๋ธ๋ผ์ฐ์ ๋ ์์ ์ด ๋ณด๋๋ ์์ฒญ์ Origin๊ณผ ์๋ฒ๊ฐ ๋ณด๋ด์ค ์๋ต์ Access-Control-Allow-Origin์ ๋น๊ตํ์ฌ ์ด ์๋ต์ด ์ ํจํ์ง ๊ฒฐ์ ํ๋ค.
๐น Preflight Request
- ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ๊ฐ์ฅ ์์ฃผ ๋ง์ฃผ์น๋ ์๋๋ฆฌ์ค
- ๋ธ๋ผ์ฐ์ ๋ ์์ฒญ์ ํ ๋ฒ์ ๋ณด๋ด์ง ์๊ณ ์๋น ์์ฒญ(Preflight)๊ณผ ๋ณธ ์์ฒญ์ผ๋ก ๋๋์ด์ ์๋ฒ๋ก ์ ์ก
- ์๋น ์์ฒญ์๋ HTTP ๋ฉ์๋ ์ค OPTIONS ๋ฉ์๋๊ฐ ์ฌ์ฉ๋จ
โจ Preflight Request
origin : ์๋ฒ์ ์์ฒญ์ด ์ค๋ ์ถ์ฒ๋ฅผ ์๋ ค์ค๋ค.
access-control-request-method : ์์ฒญ์ด ๊ตฌํํ๋ HTTP ๋ฉ์๋๋ฅผ ์๋ฒ์ ์๋ ค์ค๋ค.
access-control-request-headers : ์์ฒญ์ด ํฌํจ๋ ํค๋๋ฅผ ์๋ฒ์ ์๋ ค์ค๋ค.
- ์๋น ์์ฒญ์ ์ญํ = ๋ธ๋ผ์ฐ์ ์ค์ค๋ก ์ด ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด ์์ ํ์ง ํ์ธ
- ์์ฒญ์ ๋ํ ์๋ต์ผ๋ก ์๋ฒ๋ ์๋์ ๊ฐ์ ํค๋๋ก ์๋ตํ์ฌ ์ด ์ถ์ฒ์์ ์ด๋ฌํ ์ข ๋ฅ์ ์์ฒญ์ ์๋ฝํ ์ง ์ฌ๋ถ ๊ฒฐ์
โจ Preflight Response
access-control-allow-origin : ์๋ฒ๊ฐ ํ์ฉํ ์๋ณธ
access-control-allow-methods : ์๋ฒ์์ ํ์ฉํ ์ผํ๋ก ๊ตฌ๋ถ๋ ๋ฉ์๋ ๋ชฉ๋ก
access-control-allow-headers : ์๋ฒ์์ ํ์ฉํ๋ ์ผํ๋ก ๊ตฌ๋ถ๋ ํค๋ ๋ชฉ๋ก
access-control-max-age : preflight ์๋ต์ ์บ์ํ๋ ์๊ฐ(์ด)์ ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ค๋ค.
โจ Preflight ์์ฒญ์ ํด์ผํ๋ ์ด์ ?
๐ธ Preflight ์์ฒญ์ ํตํด ์๋ฒ๋ ์์ฒญ์ด ์คํ๋๊ธฐ ์ ์ ๊ฒ์ฌํ๊ณ ํ์ฉ ์ฌ๋ถ๋ฅผ ํ์ํ ๊ธฐํ๋ฅผ ์ป์ ์ ์๋ค.
๐ธ ์๋ฒ๋ ๊ฐ๋ฐ๋ ๋ ํ์ฉํ๋ ์์ฒญ ๋ฐ ํค๋์ ์ข ๋ฅ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
๐ธ ์๋ฒ๊ฐ ๋ค๋ฅธ ์ถ์์ ํ์ฉํ์ง ์๋ ํน์ ์์ฒญ์ ์ฐจ๋จํจ์ผ๋ก์จ ์๋ฒ๋ฅผ ๋ณดํธํ๋๋ฐ ๋์์ ์ค๋ค.
๐น Spring Boot์์ CORS ํด๊ฒฐํ๊ธฐ
@Configuration
public class CorsConfiguration implements WebMvcConfigurer{
@Override
public void addCorsMappings(CorsRegistry registry){
registry.addMapping("/api")
.allowedOrigins("http://localhost:8081");
}
}
SOP (Same-Origin-Policy, ๋์ผ ์ถ์ฒ ์ ์ฑ )
๐ ์๋ก ๋ค๋ฅธ ์ถ์ฒ์ผ ๋ ๋ฆฌ์์ค ์์ฒญ๊ณผ ์๋ต์ ์ฐจ๋จํ๋ ์ ์ฑ
๐น ์ฐจ๋จํ๋ ์ด์ : ์ฌ์ฉ์๊ฐ ์ ์ฑํ์ด์ง์ ์ ์ํ์ฌ ์ ์์ ์ธ JavaScript๊ฐ ์คํ๋๋ฉด ์ฌ์ฉ์๊ฐ ๋ชจ๋ฅด๋ ์ฌ์ด์ potal.example.com์ ์์์ ์์ฒญ์ ๋ณด๋ด๊ณ ๊ทธ ์๋ต๊ฐ์ ํด์ปค์ ์๋ฒ๋ก ์ฌ์ฐจ ๋ณด๋ด ์ฌ์ฉ์์ ๊ฐ์ธ์ ๋ณด๊ฐ ํ์ทจ๋ ์ ์๋ค.
CORS์ SOP๋ฅผ ์ฌ์ฉํ๋ ์ด์ - XSS & CSRF
๐ ๋ค๋ฅธ ์ถ์ฒ์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์๋ก ํต์ ํ๋ ๊ฒ์ ๋ํด ์๋ฌด๋ฐ ์ ์ฝ์ ๋์ง ์๋๋ค๋ฉด CSRF(Cross-Site Request Forgery)๋ XSS(Corss-Site Scripting)์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ํ์ทจํ ์ ์๋ค.
๐น XSS (Cross-Site Scripting)
- ๊ณต๊ฒฉ์๊ฐ ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ์ฌ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋๋ก ํจ์ผ๋ก์จ ๊ณต๊ฒฉ ์ํ ๐ ๋ค๋ฅธ ์น์ฌ์ดํธ์ ์ ๋ณด ๊ตํํ๋ ์์ผ๋ก ์๋
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ ฅ ๋ฐ์ ๊ฐ์ ์ ๋๋ก ๊ฒ์ฌํ์ง ์๊ณ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ์
- ์ฟ ํค๋ ์ธ์ ์ ๋ณด ํ์ทจ
- ๋ค๋ฅธ ์ฌ์ดํธ๋ก ๋ฆฌ๋ค์ด๋ ํธ
- ์นํ์ด์ง ์กฐ์
๐น CSRF (Cross-Site Request Fogery)
- ์ฌ์ฉ์๊ฐ ์์ ์ ์์ง์๋ ๋ฌด๊ดํ๊ฒ ๊ณต๊ฒฉ์๊ฐ ์๋ํ ํ์(์์ , ์ญ์ ๋ฑ๋ก ๋ฑ)๋ฅผ ํน์ ์น์ฌ์ดํธ์ ์์ฒญํ๊ฒ ํ๋ ๊ณต๊ฒฉ
- ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ์ธ์ฆ๋ ์ํ์์ ๊ณต๊ฒฉ์์ ์ ์ด ์๋ ์๋ ์นํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธ ์ ๋ฐ์
ex) ์ฌ์ฉ์๊ฐ ์ํ ์น์ฌ์ดํธ์ ๋ก๊ทธ์ธํ ์ํ์์ ์ ์์ ์ธ ์นํ์ด์ง๋ฅผ ์ด๋ฉด ๊ทธ ํ์ด์ง๋ ์ฌ์ฉ์์ ์ธ์ฆ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ๊ฑฐ๋ ๋ฑ์ ์ ์์ ์ธ ์์ฒญ์ ์๋ฒ์ ์ ์ก
์ฐธ๊ณ ์๋ฃ
https://evan-moon.github.io/2020/05/21/about-cors/
https://docs.tosspayments.com/resources/glossary/cors
'CS > ๐ ๋คํธ์ํฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๐ ๋คํธ์ํฌ] Cookie์ Session ๊ทธ๋ฆฌ๊ณ JWT (0) | 2024.03.21 |
---|