뭘 만들지 5일이나 고민했는데
생각해보니 어차피 만들 줄 아는 것도 없고 공부하려면 시간도 딱히 없넹
그래서 일단 아무렇게나 두들겨보며 익히겠다는 생각으로 계획 없이 프로젝트를 생성했다.
하나도 기억 안 난다. 망했군.
여차저차 기억 대신 손에 맡겨가며 연결했는데
오랜만에 CORS를 만났다.
CORS에 대해 잠깐 설명하자면 Cross-Origin Resource Sharing으로 서버와 브라우저의 오리진이 다른 것을 검증한다는 뜻이다.
많은 프론트엔드 독학러들을 뒷목 잡게하는 녀석이지만 사실 우리를 보호해주기 위해서 브라우저에서 열심히 일하고 있는 것으로써, 요청은 내가 했는데 받는 건 다른 녀석이 받거나 나는 가만히 있었는데 다른 놈이 요청해서 정보를 탈취하는 걸 막아주고 있는 것이니 너무 미워하지 말자.
* Origin(출처) = 도메인, 포트, 프로토콜
이런 정책을 동일 출처 정책(Single Origin Policy)라고 한다. 예를 들어 API 요청을 naver.com:8080에서 했으면 받아가는 것도 naver.com:8080에서 받아가라는 것이다.
이제 위의 메세지를 다시 읽어보면 무슨 뜻인지 이해가 된다.
" 너 API 요청은 8080포트에서 날리고 있는데 브라우저는 3001이네? 차단 "
문제는 오랜만에 했더니 어떻게 해결하는지 몰라서 뒷목 잡았다.
그래도 구글이 다 알려주니까 걱정 말아라.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import "./App.css";
import React, { useState, useEffect } from "react";
import { testAxios } from "./config/testAxios";
function App() {
// IP
const [ip, setIp] = useState("");
const findIp = (data) => {
setIp(data);
};
useEffect(() => {
testAxios("test", findIp);
}, []);
return <div className="App">{ip}에 연결 성공!</div>;
}
export default App;
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import axios from "axios";
export const testAxios = (url, findIp) => {
axios({
url: "/" + url,
method: "post",
baseURL: "http://localhost:8080",
withCredentials: true,
}).then((res) => {
findIp(res.data);
});
};
|
cs |
일단 이게 기존 코드다.useEffect로 렌더링 마다 8080/test로 post요청을 날리고 있으며 withCrentials는 쿠키 요청 여부다.
이제 스프링으로 돌아가서 다른 출처의 자원을 공유할 수 있도록 허락해줘야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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("/**")
.allowCredentials(true)
.allowedOrigins("http://localhost:3000");
}
}
|
cs |
간단 설명
WebMvcConfigurer을 상속받아서 addCorsMappings 메서드를 구현해야 한다.
addMapping("/**") -> 모든 요청 허용
allowCrentials(true) -> 쿠키 보냄
allowedOrigins("~~") -> 해당 Origns에 교차 출처 허용
더 찾아보니 역시 우리의 스프링답게 그냥 컨트롤러 위에 @CrossOrigin 붙이는 방법도 있다.
@CrossOrigin(origins = "허용할 포트", allowedHeaders ="*")이렇게 설정하면 되는데, 모든 컨트롤러에 따로 작성해줘야 한다.
사실 개인 프로젝트에 컨트롤러가 많아봐야 거기서 거기라 크게 불편하지는 않을 것 같다.
끝.
'Language & Framework > 삽질기록' 카테고리의 다른 글
삽질 기록 (6) 실수로 삭제된(?) 깃허브 팀 레파지토리 살리기 (3) | 2022.09.23 |
---|---|
삽질 기록 (5) Spring Security의 UserDetails를 만지작거리다가 만난 LocalDate관련 예외 (0) | 2022.09.03 |
삽질 기록 (4) 같은 타입의 Bean이 두 개 이상 존재할 때 (2) | 2022.08.31 |
삽질 기록 (3) 아기 MockMvc에게 한글 알려주기 (0) | 2022.08.21 |
삽질 기록 (2) 테스트 중 만난 Dto의 'Cannot construct instance of..' 에러 (0) | 2022.08.18 |