ํ๋ก ํธ์ ๋ฐฑ์๋๋ฅผ
๋ฐ๋ก ์์ฑํ ๋,
@CrossOrigin์ ๋ถ์๋ค.
@CrossOrigin
- CORS๋ฅผ ์คํ๋ง์ ํตํด ์ค์ ํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค.
- ๋ชจ๋ ๋๋ฉ์ธ๊ณผ ๋ชจ๋ ์์ฒญ๋ฐฉ์์ ๋ํด ํ์ฉํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
- ์คํ๋ง 4.2๋ถํฐ ์ง์ํ๋ค.
CORS
- ์๋ก ๋ค๋ฅธ ๋๋ฉ์ธ์์ ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ์
- ์น ํ์ด์ง์ ์ ํ๋ ์์์ ์ธ๋ถ ๋๋ฉ์ธ์์ ์ ๊ทผ์ ํ์ฉํด์ฃผ๋ ๋งค์ปค๋์ฆ
- ์ฒ์ ์ ์ก๋๋ ๋ฆฌ์์ค์ ๋๋ฉ์ธ๊ณผ ๋ค๋ฅธ ๋๋ฉ์ธ์ผ๋ก๋ถํฐ ๋ฆฌ์์ค๊ฐ ์์ฒญ๋ ๊ฒฝ์ฐ ํด๋น ๋ฆฌ์์ค๋ cross-origin HTTP ์์ฒญํ๋ค.
- Same Origin Policy์ ๋ฐ๋๋๋ ๊ฐ๋
- ์์๋ก, ๋ค๋ฅธ ์ง์์ ๋ด ์ง์ ์๋ ๊ธ๊ณ (๋ฐ์ดํฐ)๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ฃผ์ธ(์๋ฒ)์ด ํ๊ฐ์ฆ(ํน์ ์๋ต ํค๋)์ ์จ์ฃผ๋ฉด ๊ฐ๋ฅํ๋ค.
SOP
- Same Origin Policy์ ์ฝ์์ด๋ฉฐ ๋์ผํ ์ถ์ฒ์ Origin๋ง ๋ฆฌ์์ค(๋ฐ์ดํฐ)๋ฅผ ๊ณต์ ํ ์ ์๋ค.
- ๋ง์ฝ ๋์ผํ ์ถ์ฒ๊ฐ ์๋๋ผ๋ฉด OPTIONS๋ฅผ ์ด์ฉํ Preflight๋ฅผ ์ด์ฉํ์ฌ ์ฌ๋ฌ ๊ฒ์ฆ์ ๊ฑฐ์น๋ค.
- ์์๋ก, ์ฐ๋ฆฌ ์ง(์ค๋ฆฌ์ง)์ ๋ค์ด์์ผ ์ง์ ์๋ ๊ธ๊ณ (๋ฐ์ดํฐ)๋ฅผ ์ด ์ ์๋ค.
@CrossOrigin ์ฝ๋ ์์
vue์ฝ๋
const res = await axios.post("http://localhost:8080/api/register", {
name: this.name,
userId: this.userId,
pwd: this.pwd,
pwdConfirm: this.pwdConfirm,
tel: this.tel,
birth: this.birth,
email: this.email,
});
spring ์ฝ๋ - ํด๋์ค ๋จ์
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:5173")
public class RegisterController {
...
}
spring ์ฝ๋ - ๋ฉ์๋ ๋จ์
@CrossOrigin(origins = "http://localhost:5173")
@PostMapping("/register")
public ResponseEntity<String> register(@RequestBody RegisterRequest request) {
...
}
ํ๋ก ํธ๋ http://localhost:5173๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ๋ฐฑ์๋๋ http://localhost:8080๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ํฌํธ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์๋ก ๋ค๋ฅธ ์ค๋ฆฌ์ง์ผ๋ก ๊ฐ์ฃผ๋๋ค. ๊ทธ๋์ ์ด๋ฅผ ์์ธ์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ํด CORS๋ฅผ ์ด๋ค. @CrossOrigin์ SpringMVC์์ CORS ํ์ฉ ํค๋๋ฅผ ์๋์ผ๋ก ๋ฌ์์ฃผ๋ ์ญํ ์ ํ๋ค. ์์ฃผ ๊ฐ๋จํ๊ฒ ์ปจํธ๋กค๋ฌ์์ ํด๊ฒฐํ ์ ์๋ค.
ํ์ฌ ์ฝ๋์์๋ ํด๋์ค์ @CrossOrigin์ ๋ถ์๋ค. ์ด๋ ๊ฒ ํด๋ ๋์ง๋ง, ๋ฉ์๋ ๋จ์๋ก ์ ์ฉ์ํฌ์๋ ์๋ค. ๊ทธ๋ฆฌ๊ณ exposedHeaders, allowCredentials ๋ฑ ๋ค์ํ ์์ฑ์ด ์์ด์ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ง์ ํ ์ ์๋ค.
๋ค๋ฅธ๋ฐฉ๋ฒ_ WebMvcConfigurer ์ฝ๋ ์์
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
// ํ์ฉํ ์ค๋ฆฌ์ง ๋ชฉ๋ก
.allowedOrigins("http://localhost:5173")
// ํ์ฉํ HTTP ๋ฉ์๋
.allowedMethods("GET","POST","PUT","DELETE","OPTIONS")
// ์์ฒญ ํค๋ ํ์ฉ
.allowedHeaders("*")
// ํ๋ฐํธ์์ ์ฝ์ ์ ์๊ฒ ๋
ธ์ถํ ์๋ต ํค๋
.exposedHeaders("Location")
// ํฌ๋ก์ค ์ฌ์ดํธ ์ฟ ํค/์ธ์ ์ ์ก ํ์ฉ
.allowCredentials(true)
// Preflight(OPTIONS) ๊ฒฐ๊ณผ ์บ์
.maxAge(3600);
}
}
์ถ์ฒ - https://wonit.tistory.com/572
// ์คํ๋ง ๋ถํธ ์ฑ์ ์์์
@SpringBootApplication
public class RestServiceCorsApplication {
public static void main(String[] args) {
SpringApplication.run(RestServiceCorsApplication.class, args);
}
// ๋น ๋ฑ๋ก
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
// ์ ์ญ CORS ์ถ๊ฐ
public void addCorsMappings(CorsRegistry registry) {
// ๋ชจ๋ ์ํธํฌ์ธํธ์ ๋ํด CORS ์ ์ฉ, fornt-server์์ ์ค๋ ์์ฒญ๋ง ํ์ฉ
registry.addMapping("/**").allowedOrigins("http://front-server.com");
}
};
}
}
@CrossOrigin์ ๊ฐ๋จํ๊ฒ ์ค์ ํ ์ ์์ง๋ง ์ปจํธ๋กค๋ฌ์ ์๊ฐ ๋ง๊ณ ๊ทธ ์์ ์์ฑ๋ ๋ง๋ค๋ฉด ๋งค๋ฒ ์ ์ด์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ ๊ฒ์ด๋ค. ๊ทธ๋์ ์ด๋ฐ ๊ฒฝ์ฐ๋ ์ ์ญ์ ์ผ๋ก ์ค์ ํ๋๊ฒ ์ข๋ค. ์๋ง ์ค์ ์๋ฒ๋ฅผ ์ด์ํ๋ค๋ฉด ์ ์ญ์ ์ผ๋ก ์ค์ ํ๋ ๋ฐฉ์์ด ๋ ๋ง์ง ์์๊น ์ถ๋ค.
์ฒซ๋ฒ์งธ ์ฝ๋๋ ์์ CORS์ ์ ์ญ ์ค์ ์ ์ํ ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ง๋ค์๋ค. ์ฌ๋ฌ ์์ฑ์ ํฌํจ์์ผ ๋ฉ์๋, ํค๋, ์ฟ ํค ๋ฑ์ ์ง์ ํ์ฌ ๊ฐ์ ์ธํ ํด์คฌ๋ค. ๋๋ฒ์งธ ์ฝ๋๋ main ํจ์์ Bean์ผ๋ก Configurer๋ฅผ ์ถ๊ฐํ๋ค. ์์ฑ์ ๋ฐ๋ก ์ค์ ํ์ง ์์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ธํ ๋๋ค.
์๋์ ์ถ์ฒ๋ฅผ ๋จ๊ฒจ๋๊ฒ ์ต๋๋ค.
๋ธ๋ก๊ทธ์ ์ ๊ฐ ์ต๋ํ ์ดํดํ ๋ด์ฉ๊น์ง๋ง ์ ๋๊ฑฐ๋ผ
์ถ์ฒ์ ๋ค์ด๊ฐ์๋ฉด ๋ ๋ง์ ๋ด์ฉ์ด ์์ด ๊ณต๋ถํ์๋๋ฐ ๋์๋์ค๊ฒ๋๋ค.
๐ชฝ
ํ๋ฆฐ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์
REST API CrossOrigin Annotation ๊ฐ๋จ ์ ๋ฆฌ
Front์ Back ์ผ๋ก ๋๋ ์ ๊ฐ๋ฐ์ ์งํ ํ๋ ์์ ์ ํ์๋ค. ๊ทผ๋ฐ ๋ง์ ๋๋ค? ์ฝ๋๊ฐ ํ๋ฆฐ ๊ณณ์ด ์๋๋ฐ ์๊พธ ์๋ฌ๊ฐ ๋จ๋๊ฑฐ์์? ์๊พธ CORS๊ฐ ์ด์ฉ๊ณ ์ ์ฉ๊ณ , CrossOrigin์ด ์ด์ฉ๊ณ ์ ์ฉ๊ณ ์ด๋ฐ ๋ง์ด ๊ฐ๋ฐ
henniee.tistory.com
[Spring Boot] CORS ๋ฅผ ํด๊ฒฐํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ (Filter, @CrossOrigin, WebMvcConfigurer)
Server Side Template ๋ฐฉ์์ด ์๋ Front์ Back ์ผ๋ก ๋๋ ์ ์ธํ๋ผ๋ฅผ ๊ตฌ์ฑํด๋ณธ ๊ฒฝํ์ด ์๋ ์ฌ๋๋ค์๊ฒ๋ Cors๊ฐ ๋งค์ฐ ์น์ํ ์ ์๋ค. ํ์ฌ ๊ฐ๋ฐ ํ๋ฆ์์ ์น ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค๊ฐ Cors ๋ฅผ ๋ง๋ ํ๋ฅ ์
wonit.tistory.com
[HTTP] OPTIONS ํค๋์ Preflight ๊ทธ๋ฆฌ๊ณ CORS
OPTIONS ๋ RFC 7231 ์ ๋ช ์๋ HTTP์ ์ฌ๋ฌ ๋ฉ์๋ ์ค ํ๋์ด๋ค. OPTIONS ๋ ์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ ํ๋ ์์ํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ง์ ์ฌ์ฉํ ์ผ์ ๋๋ฌผ์ง๋ง ํ๋์ Front Back ์ ๋๋๋ ๊ฐ๋ฐ ํ๋ฆ์์
wonit.tistory.com
'๐ท Spring > ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] @RequestMapping์ด๋? (0) | 2025.08.20 |
---|---|
[Spring] REST์ API ๊ทธ๋ฆฌ๊ณ REST API๋? (1) | 2025.07.16 |
[Spring] GET๊ณผ POST ๊ทธ๋ฆฌ๊ณ @GetMapping (7) | 2024.10.22 |
[Spring] @Controller์ @RestController ๊ทธ๋ฆฌ๊ณ ์ํ์ฝ๋ (4) | 2024.10.18 |
[Spring] Spring MVC๋ฅผ ์์์ผ ์์์ด ๊ฐ๋ฅํ๋ค. (6) | 2024.10.15 |