Code review
π»[Code Review] WebConfig ν΄λμ€ μ½λ 리뷰.
1οΈβ£ μ 체 μ½λ.
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Controller
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // λͺ¨λ κ²½λ‘ νμ©
.allowedOriginPatterns("http://localhost:*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true) // μ격 μ¦λͺ
νμ©
.maxAge(3600);
}
}
- μ μ½λλ Spring Frameworkμμ CORS(Cross-Origin Resource Sharing) μ€μ μ μ μν μ½λμ
λλ€.
- WebMvcConfigurer μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ CORS μ μ±
μ ꡬμ±νκ³ , ν΄λΌμ΄μΈνΈ(μ: νλ‘ νΈμλ)μμ λ°±μνΈ APIμ μμ²ν λ λ°μν μ μλ CORS λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€.
2οΈβ£ CORSλ? π€
- CORS(Cross-Origin Resource Sharing)λ λΈλΌμ°μ 보μ μ μ±
μ€ νλλ‘, μΉ μ ν리μΌμ΄μ
μ΄ μμ κ³Ό λ€λ₯Έ μΆμ²(origin)μμ 리μμ€λ₯Ό μμ²ν λ μ΄λ₯Ό νμ©νκ±°λ μ ννλ λ°©μμ
λλ€.
- μλ₯Ό λ€μ΄:
- ν΄λΌμ΄μΈνΈκ°
http://localhost:3000
μμ λμνκ³ , μλ²κ° http://localhost:8080
μμ λμνλ©΄ λ λλ©μΈμ μλ‘ λ€λ₯Έ μΆμ²λ‘ κ°μ£Όλ©λλ€.
- λΈλΌμ°μ λ κΈ°λ³Έμ μΌλ‘ μ΄λ° κ΅μ°¨ μΆμ² μμ²μ μ°¨λ¨νλ―λ‘, μλ²μμ λͺ
μμ μΌλ‘ μ΄λ₯Ό νμ©ν΄μΌ ν©λλ€.
3οΈβ£ μ½λ λΆμ.
1οΈβ£ ν΄λμ€ μ μΈ.
@Controller
public class WebConfig implements WebMvcConfigurer {...}
- WebMvcConfigurerλ Spring MVC μ€μ μ 컀μ€ν°λ§μ΄μ§νκΈ° μν μΈν°νμ΄μ€μ
λλ€.
- WebConfig ν΄λμ€λ WebMvcConfigurerλ₯Ό ꡬννμ¬ Spring MVC μ€μ μ μ¬μ©μ μ μνκ³ μμ΅λλ€.
2οΈβ£ addCorsMappings λ©μλ.
@Override
public void addCorsMappings(CorsRegistry registry) {...}
- Spring MVCμμ CORS 맀νμ μ€μ νκΈ° μν΄ CorsRegistryλ₯Ό μ¬μ©ν©λλ€.
- μ΄ λ©μλλ ν΄λΌμ΄μΈνΈμμ νΉμ κ²½λ‘λ‘μ μμ²μ νμ©νκ±°λ μ ννλ κ·μΉμ μ μν©λλ€.
3οΈβ£ CORS μ€μ .
registry.addMapping("/**") // λͺ¨λ κ²½λ‘ νμ©
.allowedOriginPatterns("http://localhost:*") // localhostμ λͺ¨λ ν¬νΈ νμ©
.allowedMethods("GET", "POST", "PUT", "DELETE") // νμ©ν HTTP λ©μλ
.allowedHeaders("*") // λͺ¨λ ν€λ νμ©
.alloweCredentials(true) // μΏ ν€μ κ°μ μ격 μ¦λͺ
νμ©
.maxAge(3600) // μΊμ μκ° (μ΄ λ¨μ)
-
addMapping("/**")
- λͺ¨λ URL ν¨ν΄
(/**)
μ λν΄ CORS μ μ±
μ μ μ©ν©λλ€.
- μ:
/api/*, /resources/*
λ± λͺ¨λ κ²½λ‘ νμ©.
-
allowedOriginPatterns("http://localhost:*)"
- ν΄λΌμ΄μΈνΈκ°
http://localhost
μμ μμλλ λͺ¨λ ν¬νΈ(μ: http://localhost:3000, http://localhost:8080
)μ λν΄ μμ²μ νμ©ν©λλ€.
- Spring Boot 2.4+μμλ allowedOrigin λμ allowedOriginPatterns μ¬μ©μ κΆμ₯ν©λλ€.
-
allowedMethods("GET", "POST", "PUT", "DELETE")
- νμ©ν HTTP λ©μλ(GET, POST, PUT, DELETE)λ₯Ό μ μν©λλ€.
- μλ₯Ό λ€μ΄, OPTIONSμ κ°μ λ€λ₯Έ λ©μλλ νμ©λμ§ μμ΅λλ€.
-
allowedHeaders("*")
- λͺ¨λ μμ²μ ν€λλ₯Ό νμ©ν©λλ€.
- μ: Content-Type, Authorization λ±μ΄ νμ©λ©λλ€.
-
allowCredentials(true)
- ν΄λΌμ΄μΈνΈμμ μΏ ν€λ₯Ό μ¬μ©ν μμ²μ νμ©ν©λλ€.
- μ: μΈμ¦μ΄ νμν μμ²μμ μΏ ν€λ₯Ό ν΅ν΄ μΈμ
μ 보λ₯Ό μ λ¬ν μ μμ΅λλ€.
-
maxAge(3600)
- λΈλΌμ°μ κ° ν리νλΌμ΄νΈ μμ²(OPTIONS μμ²)μ κ²°κ³Όλ₯Ό μΊμ±νλ μκ°μ μ μν©λλ€.
- μ¬κΈ°μλ 3600μ΄(1μκ°) λμ μΊμ±ν©λλ€.
4οΈβ£ μ¬μ© μ¬λ‘.
-
1. νλ‘ νΈμλ-λ°±μλ λΆλ¦¬λ νκ²½.
- νλ‘ νΈμλμ λ°±μλκ° μλ‘ λ€λ₯Έ μΆμ²μμ λμνλ κ²½μ°:
- νλ‘ νΈμλ:
http://localhost:3000
- λ°±μλ:
http:// localhost:8080
- μ΄ κ²½μ°, λΈλΌμ°μ λ κΈ°λ³Έμ μΌλ‘ κ΅μ°¨ μΆμ² μμ²μ μ°¨λ¨νλ―λ‘ μμ κ°μ΄ CORS μ€μ μ΄ νμν©λλ€.
5οΈβ£ μ£Όμμ¬ν.
-
보μ κ³ λ €
- μ€μ λ°°ν¬ νκ²½μμλ
allowedOriginPatterns
μ μμΌλμΉ΄λ("*")
λ₯Ό μ¬μ©νλ κ²μ νΌνκ³ , νΉμ μΆμ²λ§ νμ©ν΄μΌ ν©λλ€.
- μ:
.allowedOriginPatterns("https://example.com)"
-
allowCredentials
μ *
μ μΆ©λ
-
allowCredentials(true)
μ allowedOriginPatterns("*")
λ ν¨κ» μ¬μ©ν μ μμ΅λλ€.
- μΏ ν€λ₯Ό μ¬μ©ν μμ²μ νμ©νλ €λ©΄ νΉμ μΆμ²λ₯Ό λͺ
μν΄μΌ ν©λλ€.