[WEB] SOP & CORS

yayaya_hojinΒ·2024λ…„ 1μ›” 25일

WEB

λͺ©λ‘ 보기
6/16
post-thumbnail

🌐 SOP(Same-Origin Policy)

SOPλŠ” λ™μΌν•œ 좜처 μ‚¬μ΄μ—μ„œλ§Œ λ¦¬μ†ŒμŠ€ 곡유 κ°€λŠ₯ κ·œμΉ™μ΄λ‹€. μ΄λŠ” λ‹€λ₯Έ 좜처의 λ¦¬μ†ŒμŠ€ μ‚¬μš©μ„ μ œν•œν•˜κΈ° μœ„ν•œ λΈŒλΌμš°μ € λ³΄μ•ˆ 정책이닀.

SOPλŠ” μ™ΈλΆ€ μ‚¬μš©μžκ°€ CSRF λ˜λŠ” XSS λ“± 곡격을 톡해 μ‚¬μš©μž 정보λ₯Ό νƒˆμ·¨λ‹Ήν•˜λŠ” 것을 1차적으둜 λ°©μ–΄ν•˜κΈ° μœ„ν•΄ 같은 μΆœμ²˜μ—μ„œλ§Œ μžμ›μ„ κ³΅μœ ν•  수 있게 λ§Œλ“€μ—ˆλ‹€.

url_img
μΆœμ²˜λŠ” URL의 Protocol, Host, Port 3κ°€μ§€λ‘œ μ •μ˜κ°€ 되며, 같은 좜처λ₯Ό νŒλ‹¨ν•˜λŠ” 기쀀은 μœ„ 3κ°œκ°€ λͺ¨λ‘ 같은지 ν™•μΈν•œλ‹€.

1) Protocol: http://www.domain.com:3000 κ³Ό https://www.domain.com:3000 은 λ‹€λ₯Έ ν”„λ‘œν† μ½œλ‘œ 동일 μΆœμ²˜κ°€ μ•„λ‹˜ ❌

2) Host: https://www.domain.com:3000 κ³Ό https://domain.com:3000 은 λ‹€λ₯Έ 호슀트둜 동일 μΆœμ²˜κ°€ μ•„λ‹˜ ❌

3) Port: https://www.domain.com:3000 κ³Ό https://www.domain.com:8080 은 λ‹€λ₯Έ ν¬νŠΈμž„μœΌλ‘œ 동일 μΆœμ²˜κ°€ μ•„λ‹˜ ❌

https://www.domain.com:3000/main κ³Ό https://www.domain.com:3000/search 은 ν”„λ‘œν† μ½œ, 호슀트, ν¬νŠΈκ°€ λͺ¨λ‘ λ™μΌν•¨μœΌλ‘œ 동일 μΆœμ²˜κ°€ 맞음 β­•

πŸ” CORS(Cross-Origin Resource Sharing)

CORSλŠ” μΆœμ²˜κ°€ λ‹€λ₯Έ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” 정책이닀. μ΄λŠ” SOP에 μ˜ν•΄ λ§‰ν˜€μ•Ό 될 μš”μ²­μ„ ν’€μ–΄μ£ΌλŠ” 정책이닀.

πŸ’‘λ§Œμ•½ λͺ¨λ“  μΆœμ²˜μ— λŒ€ν•œ μš”μ²­μ„ ν—ˆμš©ν•˜κ³  μ‹Άλ‹€λ©΄ Access-Control-Allow-Origin 헀더λ₯Ό (*)μ™€μΌλ“œμΉ΄λ“œλ‘œ μ„€μ •ν•˜λ©΄ λœλ‹€.

βš™οΈ CORS λ™μž‘ 원리

1) λΈŒλΌμš°μ €λŠ” λ‹€λ₯Έ Origin으둜 μš”μ²­μ„ 보냄, μ΄λ•Œ Origin 헀더에 μžμ‹ μ˜ Origin을 μ„€μ •

2) μ„œλ²„κ°€ 응닡을 λ°›κ³  응닡에 Access-Control-Allow-Origin 헀더에 μ„€μ •λœ Origin λͺ©λ‘ 검사

3) μš”μ²­μ΄ λ“€μ–΄μ˜¨ Origin 헀더 값이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 확인

πŸ™‹β€β™‚οΈ λ‹¨μˆœ μš”μ²­(Simple Request)

- λ‹¨μˆœ μš”μ²­ 쑰건

  • HTTP λ©”μ„œλ“œκ°€ GET, HEAD, POST 쀑 ν•˜λ‚˜!

  • λΈŒλΌμš°μ €μ— μ˜ν•΄ μžλ™ μ„€μ •λ˜λŠ” 헀더λ₯Ό μ œμ™Έν•˜κ³ , μš”μ²­ 헀더가 μ—¬κΈ° ν¬ν•¨λœ κ²ƒλ§Œ κ°€λŠ₯!
    (Accept, Accept-Language, Content-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width, Width ...)

πŸ™‹ ν”„λ¦¬ν”ŒλΌμ΄νŠΈ μš”μ²­(Preflight Request)

  • λ‹¨μˆœ μš”μ²­μ΄ μ•„λ‹Œ 경우, μ„œλ²„μ— μ‹€μ œ μš”μ²­μ„ 보내기 μ „ 미리 ν”„λ¦¬ν”ŒλΌμ΄νŠΈ μš”μ²­μ„ λ³΄λ‚΄μ„œ λ¨Όμ € μš”μ²­μ΄ μ•ˆμ „ν•œμ§€ 확인을 ν•œλ‹€. 이후에 확인이 되면 μ‹€μ œ μš”μ²­μ„ μ„œλ²„μ— 보내 총 λ‘λ²ˆμ˜ μš”μ²­μ„ μ „μ†‘ν•œλ‹€.

πŸ™‹β€β™€οΈ 인증정보λ₯Ό ν¬ν•¨ν•œ μš”μ²­(Credentialed Request)

  • ν•΄λ‹Ή μš”μ²­μ€ μΏ ν‚€, 토큰와 같은 μ‚¬μš©μž 식별 정보가 λ‹΄κΈ΄ μš”μ²­μ„ μ˜λ―Έν•œλ‹€. 기본적인 API μš”μ²­μ€ λ‹€λ₯Έ μΆœμ²˜μ— μš”μ²­ν•˜λŠ” κ²½μš°μ—λŠ” μΏ ν‚€ μ •λ³΄λ‚˜ 인증 정보와 κ΄€λ ¨λœ 헀더λ₯Ό μš”μ²­μ— ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€. μ΄λ•Œ 이λ₯Ό ν¬ν•¨ν•˜κ³ μž ν•œλ‹€λ©΄ credentials μ˜΅μ…˜μ„ μ‚¬μš©ν•œλ‹€.

same-origin: κΈ°λ³Έκ°’, 같은 좜처 κ°„ μš”μ²­μ—λ§Œ 인증 정보 포함

include: λ‹€λ₯Έ μΆ•μ²˜μ— μš”μ²­ν•˜λŠ” 경우 항상 인증 정보 포함

omit: 인증 정보λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠμŒ

μ„œλ²„λŠ” 응닡 μ‹œ Access-Control-Allow-Credentials 헀더λ₯Ό true둜 μ„€μ •ν•΄μ•Όν•œλ‹€.

μ΄λ•Œ Access-Control-Allow-Origin 헀더 값은 (*)μ™€μΌλ“œμΉ΄λ“œλ₯Ό μ‚¬μš©ν•  수 μ—†μœΌλ©΄, μΆœμ²˜κ°€ λͺ…ν™•ν•΄μ•Ό ν•œλ‹€.

0개의 λŒ“κΈ€