본문 바로가기
Tech/Spring

CORS.. 많이 듣긴했는데...

반응형

SOP란?

 

CORS (Cross-Origin Resource Sharing)

  • 웹 서버 도메인간 액세스 제어 기능을 제공하여 보안 도메인간 데이터 전송을 가능하게 해준다.
  • SOP는 지난 2011년, RFC 6454에서 처음 등장한 보안 정책으로 말 그대로 같은 출처에서만 리소스를 공유할 수 있다라는 규칙을 가진 정책이다.
    • 하지만... 무조껀 막을 수도 없으니 몇 가지 예외 조항을 두고 출처가 다르더라도 허용하기로 했는데, 그 중 하나가 CORS 정책을 지킨 리소스 요청이다

 

이런 개념이 왜 등장한걸까..?

  • 즉 우리가 다른 출처로 리소스를 요청한다면 SOP 정책을 위반한 것이 되고,
    CORS 정책같은 조항을 지키지 않는다면 아예 다른 출처의 리소스를 사용할 수 없게 되는 것이다.
  • 출처가 다른 두 개의 어플리케이션이 마음대로 소통할 수 있는 환경은 꽤 위험한 환경이다.
    • 일단 웹에서 동작되는 클라이언트 어플리케이션 사용자 공격에 굉장히 취약하다.
      • 브라우저의 개발자 도구만 열어도... DOM, 서버 통신 전부 알 수 있다...
    • CSRF(Cross-Site Request Forgery)
      • 사이트 간 요청 위조
      • 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다.
    • XSS(Cross-Site Scripting)
      • 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점
      • 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타난다.



SpringBoot에서 CORS 활용하기

  • 우선, 서버에서는 브라우저에 다음과 같은 키를 header에 보내줘야 한다.
    • Access-Control-Allow-Orgin
      • 요청을 보내는 페이지의 출처 (*, 도메인)
    • Access-Control-Allow-Methods
      • 요청을 허용하는 메소드 (Default : GET, POST, HEAD)
    • Access-Control-Max-Age
      • 클라이언트에서 pre-flight의 요청 결과를 저장할 시간 지정. 해당 시간 동안은 pre-flight를 다시 요청하지 않는다.
    • Access-Control-Allow-Headers
      • 요청을 허용하는 헤더

 

  • 방법1: 각기 컨트롤러에 @CrossOrigin 붙이기
  • 방법2: 글로벌하게 적용하기
@Bean
public WebMvcConfigurer webMvcConfigurer() {
	return new WebMvcConfigurer() {
		@Override
		public void addCorsMappings(CorsRegistry registry) {
			registry.addMapping("/message/**")
					.allowedOrigins("*")
					.allowedMethods(HttpMethod.POST.name())
					.allowCredentials(false)
					.maxAge(3600);
		}
	};
}
  •  
  • 방법3: 간단하게 Properties로 적용
    • management.endpoints.web.cors.allowed-origins=http://other-domain.com
    • management.endpoints.web.cors.allowed-methods=GET,POST
728x90
반응형