Home > CS > 2024 > πŸ’Ύ [CS] CORSλž€?

πŸ’Ύ [CS] CORSλž€?
CS

πŸ’Ύ [CS] CORSλž€?

1️⃣ CORS.

  • CORS(Cross-Origin Resource Sharing)λŠ” μ›Ή λΈŒλΌμš°μ €κ°€ μ„œλ‘œ λ‹€λ₯Έ 좜처(도메인, ν”„λ‘œν† μ½œ, λ˜λŠ” 포트)λ₯Ό 가진 λ¦¬μ†ŒμŠ€ κ°„μ˜ μš”μ²­μ„ μ•ˆμ „ν•˜κ²Œ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•˜λŠ” λ³΄μ•ˆ κΈ°λŠ₯μž…λ‹ˆλ‹€.
  • CORS(Cross-Origin Resource Sharing)λŠ” μ›Ή νŽ˜μ΄μ§€κ°€ λ‹€λ₯Έ 좜처의 λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•  λ•Œ λ°œμƒν•˜λŠ” λ³΄μ•ˆ μ œμ•½μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

2️⃣ μ™œ CORSκ°€ ν•„μš”ν•œκ°€?

  • μ›Ή λ³΄μ•ˆ λͺ¨λΈμ—μ„œ 동일 좜처 μ •μ±…(Same-Origin Policy)은 λ³΄μ•ˆμƒμ˜ 이유둜, μ›Ή νŽ˜μ΄μ§€μ—μ„œ λ‘œλ“œλœ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μžμ‹ μ΄ λ‘œλ“œλœ 좜처 μ™ΈλΆ€μ˜ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•˜λŠ” 것을 μ œν•œν•©λ‹ˆλ‹€.
    • 즉, ν•œ μ›Ή νŽ˜μ΄μ§€μ—μ„œ λ‘œλ“œλœ μŠ€ν¬λ¦½νŠΈλŠ” λ‹€λ₯Έ 좜처의 λ¦¬μ†ŒμŠ€(예: API μ—”λ“œν¬μΈνŠΈ, 이미지 λ“±)에 μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.
    • 이 λ³΄μ•ˆ 정책은 μ‚¬μ΄νŠΈ κ°„ μš”μ²­ μœ„μ‘°(CSRF)와 같은 곡격을 λ°©μ§€ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.
  • ν•˜μ§€λ§Œ, λ§Žμ€ 경우 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ™ΈλΆ€ APIλ‚˜ λ‹€λ₯Έ 도메인에 μžˆλŠ” λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•΄μ•Ό ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.
    • μ΄λ•Œ, CORSλ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • μΆœμ²˜μ—μ„œ μ˜€λŠ” μš”μ²­μ„ ν—ˆμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ CORS의 λ™μž‘ 방식.

  • CORSλŠ” μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ— λŒ€ν•΄ λ‹€λ₯Έ μΆœμ²˜μ—μ„œμ˜ 접근을 ν—ˆμš©ν• μ§€ μ—¬λΆ€λ₯Ό HTTP 헀더λ₯Ό 톡해 λͺ…μ‹œν•©λ‹ˆλ‹€.

CORSλ₯Ό κ΅¬ν˜„ν•˜λŠ” κ³Όμ •.

  • 1. Preflight Request
    • λΈŒλΌμš°μ €λŠ” μ‹€μ œ μš”μ²­μ„ 보내기 전에 OPTIONS λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ μ„œλ²„μ— β€œμ‚¬μ „ μš”μ²­(preflight request)”을 λ³΄λƒ…λ‹ˆλ‹€.
      • 이 μš”μ²­μ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ 보내렀고 ν•˜λŠ” μ‹€μ œ μš”μ²­μ˜ λ©”μ„œλ“œμ™€ 헀더가 μ„œλ²„μ—μ„œ ν—ˆμš©λ˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
  • 2. μ„œλ²„ 응닡
    • μ„œλ²„λŠ” Access-Control-Allow-Origin λ“±μ˜ CORS κ΄€λ ¨ 헀더λ₯Ό ν¬ν•¨ν•œ 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
      • 이 응닡을 톡해 λΈŒλΌμš°μ €λŠ” ν•΄λ‹Ή 좜처의 μš”μ²­μ„ ν—ˆμš©ν• μ§€ κ²°μ •ν•©λ‹ˆλ‹€.
  • 3. μ‹€μ œ μš”μ²­
    • μ„œλ²„κ°€ ν—ˆμš©ν•œ 경우, λΈŒλΌμš°μ €λŠ” μ‹€μ œ μš”μ²­μ„ 보내고 μ„œλ²„μ—μ„œ 데이터λ₯Ό λ°›μ•„μ˜΅λ‹ˆλ‹€.

4️⃣ μ£Όμš” CORS 헀더.

  • Access-Control-Allow-Origin
    • ν΄λΌμ΄μ–ΈνŠΈκ°€ 접근을 ν—ˆμš©λ°›μ€ 좜처λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
    • λͺ¨λ“  좜처λ₯Ό ν—ˆμš©ν•˜λ €λ©΄ *λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
Access-Control-Allow-Origin: https://example.com
  • Access-Control-Allow-Methods
    • μ„œλ²„κ°€ ν—ˆμš©ν•˜λŠ” HTTP λ©”μ„œλ“œ(GET, POST, PUT, DELETE λ“±)λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
Access-Control-Allow-Methods: GET, POST
  • Access-Control-Allow-Credentials
    • μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ˜ 자격 증λͺ…(μΏ ν‚€, 인증 헀더 λ“±)을 ν¬ν•¨ν•œ μš”μ²­μ„ ν—ˆμš©ν• μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.
      • κ°’μœΌλ‘œλŠ” true λ˜λŠ” falseκ°€ 올 수 μžˆμŠ΅λ‹ˆλ‹€.
Access-Control-Allow-Credentials: true
  • Access-Control-Max-Age
    • λΈŒλΌμš°μ €κ°€ 사전 μš”μ²­μ˜ κ²°κ³Όλ₯Ό μΊμ‹œν•  수 μžˆλŠ” μ‹œκ°„μ„ 초 λ‹¨μœ„λ‘œ μ§€μ •ν•©λ‹ˆλ‹€.
Access-Control-Max-Age: 3600

5️⃣ CROS μ„€μ • μ˜ˆμ‹œ(μ„œλ²„ μΈ‘)

  • μ„œλ²„ μΈ‘μ—μ„œ CORSλ₯Ό μ„€μ •ν•˜λŠ” 방법은 μ‚¬μš© 쀑인 μ›Ή μ„œλ²„ λ˜λŠ” ν”„λ ˆμž„μ›Œν¬μ— 따라 λ‹€λ¦…λ‹ˆλ‹€.
    • λ‹€μŒμ€ Java SpringBoot μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ CORSλ₯Ό μ„€μ •ν•˜λŠ” μ˜ˆμž…λ‹ˆλ‹€.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("https://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowedCredentials(true)
                .maxAge(3600);
            
    }
}
  • μœ„ 섀정은 νŠΉμ • 좜처(https://example.com)μ—μ„œ μ˜€λŠ” λͺ¨λ“  경둜의 μš”μ²­μ— λŒ€ν•΄ CORSλ₯Ό ν—ˆμš©ν•˜κ³ , νŠΉμ • HTTP λ©”μ„œλ“œμ™€ 헀더λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

6️⃣ μš”μ•½.

  • CORS λŠ” μ›Ή λΈŒλΌμš°μ €κ°€ μ„œλ‘œ λ‹€λ₯Έ 좜처의 λ¦¬μ†ŒμŠ€μ— μ•ˆμ „ν•˜κ²Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•œ λ³΄μ•ˆ κΈ°λŠ₯μž…λ‹ˆλ‹€.
  • CORS λŠ” μ„œλ²„κ°€ 응닡 헀더λ₯Ό 톡해 νŠΉμ • 좜처의 μš”μ²­μ„ ν—ˆμš©ν•  수 μžˆλ„λ‘ ν•˜λ©°, 이λ₯Ό 톡해 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ™ΈλΆ€ APIλ‚˜ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • CORS λ₯Ό 적절히 μ„€μ •ν•˜λ©΄, λ³΄μ•ˆμ„±μ„ μœ μ§€ν•˜λ©΄μ„œλ„ λ‹€μ–‘ν•œ μΆœμ²˜μ—μ„œμ˜ λ¦¬μ†ŒμŠ€ 접근을 ν—ˆμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.