주특기 미니 프로젝트가 시작 되었다.
백엔드와 처음하는 협업으로 나는 로그인, 회원가입 페이지를 맡았다.
로그인 회원가입 페이지 구현을 끝내고 서버에게서 받은 주소를 연결하여 회원가입, 로그인을 하면 network 에러가 났다.
그러면서 CORS에러도 같이 났는데 찾아보니 클라이언트에서 서버로 api요청을 보낼 때 흔히 볼 수 있는 에러중 하나였다.
동일 출처 정책(same-origin policy):
어떤 Origin 에서 불러온 문서나 스크립트가 다른 출처에서 가져온 리소스와 상호작용하는 것을 제한하는 중요한 보안 방식입니다. 동일 출처 정책은 잠재적으로 해로울 수 있는 문서를 분리함으로써 공격받을 수 있는 경로를 줄여줍니다.
즉, SOP는 다른 origin으로 부터 요청 받는 리소스를 접근제한하는 보안 정책이라고 할 수 있다.
나는 localhost:3000으로 개발 중이고 서버에서는 배포한 퍼블릭 IP주소를 주셨다.
이럴 경우 다른 origin으로 취급되어 sop를 위반하게 되는데 이런 상황을 CORS 에러라고 한다.
교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제입니다. 웹 애플리케이션은 리소스가 자신의 출처(도메인, 프로토콜, 포트)와 다를 때 교차 출처 HTTP 요청을 실행합니다.
해결방법은 여러가지가 있었다. 클라이언트쪽에서도 해결할 수 있고 서버쪽에서도 해결할 수 있었다.
해결방법
프론트엔드 - proxy server 도임
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
'/api',
createProxyMiddleware({
target: 'http://localhost:3000',
changeOrigin: true,
})
);
};
@RestController
@CrossOrigin(origins = "http://localhost:3000")
@RequiredArgsConstructor
@RequestMapping("/api/users")
public class UserController {
....
}