Computer Science/πŸ“‘ Network

[λ„€νŠΈμ›Œν¬] SOP(Same Origin Policy)와 CORS(Cross-Origin Resource Sharing), CORS 였λ₯˜ ν•΄κ²° 방법

J1Yun 2023. 2. 13. 16:14
728x90

SOP(Same Origin Policy)

  • 같은 좜처의 HTTP μš”μ²­λ§Œμ„ ν—ˆλ½ν•˜λŠ” μ •μ±…
  • μžμ›μ„ μš”μ²­ν•œ μΆœμ²˜μ™€ ν•΄λ‹Ή μš”μ²­μ— μ‘λ‹΅ν•˜λŠ” μ„œλ²„μ˜ μΆœμ²˜κ°€ λ‹€λ₯Ό 경우 ν•΄λ‹Ή μžμ›μ„ μ‚¬μš©ν•˜μ§€ λͺ»ν•˜λ„둝 μ œν•œ -> CORS 정책을 지켰을 μ‹œμ—λ§Œ μ˜ˆμ™Έμ μœΌλ‘œ ν—ˆμš©
  • SOP 정책이 없을 μ‹œ λ…ΈμΆœλœ μ†ŒμŠ€μ½”λ“œλ₯Ό 톡해 CSRF(Cross-Site Request Forgery)λ‚˜ XSS(Cross-Site Scripting)와 같은 λ°©λ²•μœΌλ‘œ 곡격자의 μ‚¬μš©μž 정보 νƒˆμ·¨ μœ„ν—˜μ΄ 있음

 

β€» 좜처(Origin)λž€?

μœ„μ™€ 같은 URL κ΅¬μ‘°μ—μ„œ Protocol + Host + Port에 ν•΄λ‹Ήν•˜λŠ” 뢀뢄을 λœ»ν•œλ‹€. λΈŒλΌμš°μ €λŠ” Protocol, Host, Portκ°€ λͺ¨λ‘ κ°™λ‹€λ©΄ 같은 좜처, μ…‹ 쀑 ν•˜λ‚˜λΌλ„ λ‹€λ₯΄λ‹€λ©΄ λ‹€λ₯Έ 좜처라고 νŒλ‹¨ν•œλ‹€.

 

 

CORS(Cross-Origin Reource Sharing)

  • ꡐ차 좜처(λ‹€λ₯Έ 좜처) λ¦¬μ†ŒμŠ€ 곡유
  • μ„œλ²„μΈ‘μ—μ„œ CORS 헀더λ₯Ό ν†΅ν•΄μ„œ λ‹€λ₯Έ 좜처(μ›Ή)μ—μ„œ μžμ›μ— μ ‘κ·Όν•  수 μžˆλŠ” κΆŒν•œμ„ λΆ€μ—¬ν•˜λ„λ‘ λΈŒλΌμš°μ €μ—κ²Œ μ•Œλ €μ£ΌλŠ” μ •μ±…
  • μΆœμ²˜κ°€ λ‹€λ₯Έ μš”μ²­μ΄λ”λΌλ„ CORS 헀더λ₯Ό 톡해 CORS 정책을 잘 지켰닀면 μ œλŒ€λ‘œ μ‘λ‹΅ν•˜λ„λ‘ ν—ˆμš©

 

CORS λ™μž‘ 방식 (CORS μœ„λ°˜ μ—¬λΆ€ 확인 방법)

  1. μ›Ή ν΄λΌμ΄μ–ΈνŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ HTTP ν”„λ‘œν† μ½œμ„ 톡해 λ‹€λ₯Έ 좜처의 λ¦¬μ†ŒμŠ€ μš”μ²­
  2. λΈŒλΌμš°μ €λŠ” μš”μ²­ ν—€λ”μ˜ Originμ΄λΌλŠ” ν•„λ“œμ— μš”μ²­μ„ λ³΄λ‚΄λŠ” 좜처λ₯Ό μΆ”κ°€λ‘œ λ‹΄μ•„μ„œ 보냄
  3. μ„œλ²„λŠ” 응닡 헀더에 Access-Control-Allow-Origin(λ¦¬μ†ŒμŠ€μ— 접근이 ν—ˆμš©λœ 좜처)λ₯Ό λ‹΄μ•„μ„œ 보냄
  4. λΈŒλΌμš°μ €λŠ” μš”μ²­ μ‹œ 보낸 Originκ³Ό 응닡 헀더 μ†μ˜ Access-Control-Allow-Origin을 비ꡐ
    • Access-Control-Allow-Origin에 Origin이 ν¬ν•¨λœλ‹€λ©΄ ν΄λΌμ΄μ–ΈνŠΈλ‘œ 응닡 전솑
    • ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ λΈŒλΌμš°μ €λŠ” ν•΄λ‹Ή 응닡을 버리고 CORS μ •μ±… μœ„λ°˜ λ©”μ‹œμ§€λ₯Ό console에 좜λ ₯

 

CORS μ‹œλ‚˜λ¦¬μ˜€

CORS의 ꡬ체적인 λ™μž‘ 방식은 μ•„λž˜ μ„Έ κ°€μ§€μ˜ μ‹œλ‚˜λ¦¬μ˜€μ— 따라 λ³€κ²½λœλ‹€. μš”μ²­μ΄ μ–΄λ–€ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό λ”°λ₯΄λŠ” 지에 따라 ν•΄κ²° 방법도 달라진닀.

1. Preflight Request

  • λΈŒλΌμš°μ €λŠ” μš”μ²­μ„ ν•œλ²ˆμ— 보내지 μ•Šκ³  μ˜ˆλΉ„ μš”μ²­(prefight)κ³Ό λ³Έ μš”μ²­μœΌλ‘œ λ‚˜λˆ„μ–΄ 두 번 μš”μ²­ 전솑
  • μ˜ˆλΉ„ μš”μ²­μ—λŠ” HTTP λ©”μ†Œλ“œ 쀑 OPTIONS λ©”μ†Œλ“œ μ‚¬μš©
  • λΈŒλΌμš°μ €λŠ” μ˜ˆλΉ„ μš”μ²­μœΌλ‘œ 톡해 λ³Έ μš”μ²­μ΄ μ•ˆμ „ν•˜κ²Œ 전달될 수 μžˆμ„ 지 슀슀둜 확인
    • Javascript의 Fetch API 등을 ν™œμš©ν•΄ λΈŒλΌμš°μ €μ—κ²Œ λ¦¬μ†ŒμŠ€λ₯Ό λ°›μ•„μ˜€λΌλŠ” λͺ…령을 보냄
    • 이에 λŒ€ν•΄ λΈŒλΌμš°μ €λŠ” μ„œλ²„μ—κ²Œ 미리 μ˜ˆλΉ„ μš”μ²­μ„ 보냄
    • μ„œλ²„λŠ” 이에 λŒ€ν•œ 응닡 헀더에 ν˜„μž¬ μžμ‹ μ΄ μ–΄λ–€ 것(λ©”μ†Œλ“œ/헀더)λ₯Ό ν—ˆμš©ν•˜κ³  μ–΄λ–€ 것을 κΈˆμ§€ν•˜λŠ”μ§€μ— λŒ€ν•œ 정보λ₯Ό λ‹΄μ•„ 전솑
    • λΈŒλΌμš°μ €λŠ” μžμ‹ μ΄ 보낸 μ˜ˆλΉ„ μš”μ²­κ³Ό 응닡 ν—€λ”μ˜ ν—ˆμš© 정책을 λΉ„κ΅ν•œ ν›„ ν•΄λ‹Ή μš”μ²­μ΄ μ•ˆμ „ν•˜λ‹€κ³  νŒλ‹¨λ˜λ©΄ 같은 μš”μ²­(λ³Έ μš”μ²­)을 λ‹€μ‹œ 보냄

2. Simple Request

  • μ˜ˆλΉ„ μš”μ²­μ„ 보내지 μ•Šκ³  μ„œλ²„μ—κ²Œ λ°”λ‘œ λ³Έ μš”μ²­μ„ μ „μ†‘ν•œ ν›„ μ„œλ²„κ°€ μ΄μ—λŒ€ν•œ 응닡 헀더에 Access-Control-Allow-Origin을 보내면 μ΄λ•Œ λΈŒλΌμš°μ €κ°€ CORS μ •μ±… μœ„λ°˜ μ—¬λΆ€λ₯Ό κ²€μ‚¬ν•˜λŠ” 방식
  • Prefight Request와 μœ μ‚¬ν•˜μ§€λ§Œ μ˜ˆλΉ„ μš”μ²­ 유무만 닀름
  • μ˜ˆλΉ„ μš”μ²­μ„ μƒλž΅ν•  수 μžˆλŠ” κ²½μš°λŠ” μ •ν•΄μ Έ 있음
    • μš”μ²­ λ©”μ†Œλ“œλŠ” GET, HEAD, POST 쀑 ν•˜λ‚˜μ—¬μ•Ό 함
    • Accept, Accept-Language, Content-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width, Widthλ₯Ό μ œμ™Έν•œ ν—€λ”λŠ” μ‚¬μš©ν•˜λ©΄ μ•ˆλ¨
    • λ§Œμ•½ Content-Typeλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ application/x-www-form-urlencoded, multipart/form-data, text/plain만 ν—ˆμš©

3. Credentialed Request

  • 인증된 μš”μ²­μ„ μ‚¬μš©ν•˜λŠ” 방법
  • λ‹€λ₯Έ 좜처 κ°„ ν†΅μ‹ μ—μ„œ μ’€ 더 λ³΄μ•ˆμ„ κ°•ν™”ν•˜κΈ° μœ„ν•΄ μ‚¬μš©
  • credentialsμ΄λΌλŠ” μ˜΅μ…˜μ„ 톡해 μš”μ²­ 헀더에 인증과 κ΄€λ ¨ν•œ 정보λ₯Ό 담을 수 μžˆλ„λ‘ 함
    • same-origin(κΈ°λ³Έκ°’): 같은 좜처 κ°„ μš”μ²­μ—λ§Œ 인증 정보λ₯Ό 담을 수 μžˆλ‹€
    • include: λͺ¨λ“  μš”μ²­μ— 인증 정보λ₯Ό 담을 수 μžˆλ‹€
    • omit: λͺ¨λ“  μš”μ²­μ— 인증 정보λ₯Ό 담지 μ•ŠλŠ”λ‹€
  • credentials μ˜΅μ…˜μ— same-originμ΄λ‚˜ include와 같은 μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 인증 정보가 ν¬ν•¨λ˜μ—ˆλ‹€λ©΄ λΈŒλΌμš°μ €λŠ” λ‹€λ₯Έ 좜처의 λ¦¬μ†ŒμŠ€ μš”μ²­ μ‹œ Access-Control-Allow-Origin 확인 뿐만 μ•„λ‹ˆλΌ 좔가적인 검사 쑰건을 μΆ”κ°€
    • μ„œλ²„ 응닡 ν—€λ”μ—λŠ” Access-Control-Allow-Origin의 κ°’μœΌλ‘œ μ™€μΌλ“œμΉ΄λ“œ(*)λ₯Ό μ‚¬μš©ν•  수 μ—†μœΌλ©° λͺ…μ‹œμ μΈ URL을 μž‘μ„±ν•΄μ•Όν•œλ‹€
    • μ„œλ²„ 응닡헀더에 Access-Control-Allow-CredentialsλΌλŠ” 헀더와 κ·Έ κ°’μ•„ true둜 μ„€μ •λ˜μ–΄ μžˆμ–΄μ•Όν•œλ‹€

 

CORS ν•΄κ²° 방법

  • μ„œλ²„μ—μ„œ Access-Control-Allow-Origin μ„ΈνŒ…ν•˜κΈ°
    • Access-Control-Allow-Origin: \*λŠ” λͺ¨λ“  μΆœμ²˜μ—μ„œ μ˜€λŠ” μš”μ²­μ„ ν—ˆμš©ν•œλ‹€λŠ” 뜻으둜 λ‹Ήμž₯은 νŽΈν• μ§€λΌλ„ λ³΄μ•ˆμƒ 쒋지 μ•ŠμŒ
    • Access-Control-Allow-Origin: https://J1Yun.github.comκ³Ό 같이 ν—ˆμš© 좜처λ₯Ό λͺ…ν™•νžˆ μ μ–΄μ£ΌλŠ” 것이 μ’‹μŒ
  • ν”„λ‘ νŠΈμ—μ„œ Webpack Dev Server둜 λ¦¬λ²„μŠ€ ν”„λ‘μ‹±ν•˜κΈ°
    • μ›ΉνŒ©κ³Ό webpack-dev-serverμ—μ„œ μ œκ³΅ν•˜λŠ” ν”„λ‘μ‹œ κΈ°λŠ₯을 ν™œμš©ν•˜μ—¬ CORS μ •μ±… 우회
728x90