Home > Code Review > πŸ’»[Code Review] WebConfig 클래슀 μ½”λ“œ 리뷰.

πŸ’»[Code Review] WebConfig 클래슀 μ½”λ“œ 리뷰.
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("*")λŠ” ν•¨κ»˜ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
    • μΏ ν‚€λ₯Ό μ‚¬μš©ν•œ μš”μ²­μ„ ν—ˆμš©ν•˜λ €λ©΄ νŠΉμ • 좜처λ₯Ό λͺ…μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.