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 λ₯Ό μ μ ν μ€μ νλ©΄, 보μμ±μ μ μ§νλ©΄μλ λ€μν μΆμ²μμμ 리μμ€ μ κ·Όμ νμ©ν μ μμ΅λλ€.