코딩박스

[Spring] CORS 란? CORS 해결

by 코박7

CORS 란? CORS 해결

현재 MSA cloud 기반으로 개발중에 client server 에서 api 서버를 호출하는 경우 CORS 이슈로 제대로된 response 를 받지 못하는 이슈가 생겼다.

 

CORS 란 ?

우선 CORS 의 개념에 대해 살펴보자 CORS 란 Cross Origin Resource Sharing 이라고도 하며, 도메인 또는 웹 페이지가 다른 도메인 (도메인간 요청이 되겠다.)을 가진 리소스에 액세스 할 수 있게하는 보안 매커니즘이며, 동일 출저 정책떄문에 등장했다고 한다.

쉽게 풀어 설명하면 서로 다른 출처간에 리소스를 전달하는 방식을 제어하는 체제이다.

 

동일 출처 정책 ?

동일 출처 정책이란 다른 출처에서 가져온 리소스와 상호작용하는 것을 제한하는 중요한 보안 방식이라고 한다. (https://developer.mozilla.org/ko/docs/Web/Security/Same-origin_policy)

우선 동일한 출처란 프로토콜, 호스트명, 포트가 같다는걸 의미한다.

https://naver.com:8080 을 예를들어보자, https 는 프로토콜, naver.com 은 호트스명, 8080은 포트가 된다.

여기서 이제 의문이 드는점이 있다. 왜 동일한 출처만 접근하도록 허용해주는것일까 ?

예를들어 A 라는 보안회사에 로그인을 한 후 인증 토큰을 받았다고 생각해보자. 그런데 여기서 로그인한 상태에서 B 라는 악성코드회사에 접속하게 되면, B 회사 사이트에서 A 회사 api 로 ajax 요청을 보낼때 A 회사에 로그인해서 받은 토큰이 자동으로 첨부되어 사용자인척 할 수 있는 문제점이 생긴다.

이래서 동일 출처 정책이 생겼다고 한다.

 

해결하는법 ?

내가 맡고있는 프로젝트에서 가장 좋은 방법은 우선 Gateway 가 완성되어야 한다.

하지만 아직 Gateway 에 대한 지식도 부족하고 구현도 아직 안되었으니 차선책으로 가야하는 상황이었다.

여기서 하나 발견한 어노테이션이 CrossOrigin 어노테이션이다.

GetMapping("/example/{id}")
@CrossOrigin
public ResponseEntity<Long> read(@PathVariable Long id) {
	...
}

위 예제와 같이 @CrossOrigin 어노테이션을 붙여주면 기본적으로 모든 도메인, 모든 요청방식 에 대해 허용한다라는 뜻이다.

Gateway가 구현되기전까지는 이렇게 사용하겠지만 모든 도메인, 모든 요청방식에 대해 허용한다는건 그만큼 보안에 취약해지는것같다. 이 부분에 대해선 더 알아봐야겠다.

 

이상.

블로그의 정보

코딩박스

코박7

활동하기