이 영역을 누르면 첫 페이지로 이동
일반인의 웹 개발일기 블로그의 첫 페이지로 이동

일반인의 웹 개발일기

페이지 맨 위로 올라가기

[Spring Boot] CORS Filter 설정하기 (CORS 오류 해결방법) - Java

일반인의 웹 개발일기

[Spring Boot] CORS Filter 설정하기 (CORS 오류 해결방법) - Java

  • 2023.07.11 10:07
  • 개발 이야기/Spring Boot
반응형

웹 개발을 하다 보면 CORS 오류는 많이 볼 수밖에 없다.

최근 Spring Boot로 개발을 진행하면서 발생했던

CORS 오류를 어떻게 해결했는지에 대한 과정이다.

 

CORS (Cross Origin Resource Sharing) Policy
직역하자면 출처가 서로 다른 자원들을 공유한다는 뜻으로 브라우저가 리소스 로드를 허용해야 하는 자체 출처 이외의 모든 출처 (도메인, 스키마 또는 포트)를 서버가 표시할 수 있도록 하는 정책.

 

 

Cross-Origin Resource Sharing (CORS) - HTTP | MDN

Cross-Origin Resource Sharing (CORS) is an HTTP-header based mechanism that allows a server to indicate any origins (domain, scheme, or port) other than its own from which a browser should permit loading resources. CORS also relies on a mechanism by which

developer.mozilla.org


1. CORS 오류 발생

프론트엔드, 백엔드 개발자 구분 없이 CORS 관련 오류는 많이 봤을 거란 생각이 든다.

내가 겪었던 CORS policy 오류는 특히나 테스트할 때 많이 발생했던 것 같다.

Access to XMLHttpRequest at 'http://test.co.kr/home' from origin 'http://localhost:8000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. main.dart.js:67750

 

이 놈의 CORS 오류는 브라우저의 출처 동일 정책(SOP - Same Origin Policy) 때문에 생겨났다고 한다.

2. CORS 설정하기

내 경우는 WebConfig에서 addCorsMappings 오버라이딩을 통해 CORS 설정을 했다.

package com.deepit.stock.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.deepit.stock.filter.JwtAuthorizationFilter;
import com.deepit.stock.jwt.JwtTokenProvider;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final JwtTokenProvider jwtTokenProvider;
@Value("${jwt.filter.enable:false}")
private boolean jwtFilterEnable;
@Bean
public FilterRegistrationBean<JwtAuthorizationFilter> jwtAuthorizationfilter() {
FilterRegistrationBean<JwtAuthorizationFilter> filterBean = new FilterRegistrationBean<>();
filterBean.setFilter(new JwtAuthorizationFilter(jwtTokenProvider, jwtFilterEnable));
filterBean.addUrlPatterns("/*");
filterBean.setOrder(0);
return filterBean;
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(false).maxAge(6000);
}
}

 

그런데....

그래도 CORS 오류가 발생한다....😂

 

정보들을 찾아보니 addCorsMappings메소드는 Spring MVC에서 사용하는 메소드로

 

설정을 자동으로 하는 Spring Boot와는 설정 충돌이 일어날 수 있다고 한다!!!

 

3. CorsFilter 설정하기

CorsFilter를 추가하여 직접 설정을 하면 된다.

CorsFilter를 만들어도 되는데 내 경우는 WebConfig에 설정을 추가했다.

@Bean
public FilterRegistrationBean<CorsFilter> corsFilterRegistrationBean() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(false);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
config.setMaxAge(6000L);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean<CorsFilter> filterBean = new FilterRegistrationBean<>(new CorsFilter(source));
filterBean.setOrder(0);
return filterBean;
}

 

만약 여러 필터를 사용 중이라면 CorsFilter의 순서를 가장 빠르게 하면 된다.

 

테스트 용도라 CORS 헤더를 "*" 사용해서 모두 허용했지만,

필요에 맞게 값은 수정하면 된다.

 

CORS 헤더

  • Access-Control-Allow-Origin
  • Access-Control-Allow-Headers
  • Access-Control-Allow-Methods
  • Access-Control-Allow-Credentials
  • Access-Control-Max-Age

반응형

'개발 이야기 > Spring Boot' 카테고리의 다른 글

[Spring Boot] Java RESTful API 만들어서 GET, POST 호출 해보기  (2) 2022.12.01
[Spring Boot] 이클립스(Eclipse) 설치 및 스프링 부트(Spring Boot) 사용하기  (0) 2022.11.30

댓글

댓글을 사용할 수 없습니다.

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Spring Boot] Java RESTful API 만들어서 GET, POST 호출 해보기

    [Spring Boot] Java RESTful API 만들어서 GET, POST 호출 해보기

    2022.12.01
  • [Spring Boot] 이클립스(Eclipse) 설치 및 스프링 부트(Spring Boot) 사용하기

    [Spring Boot] 이클립스(Eclipse) 설치 및 스프링 부트(Spring Boot) 사용하기

    2022.11.30
다른 글 더 둘러보기

정보

일반인의 웹 개발일기 블로그의 첫 페이지로 이동

일반인의 웹 개발일기

  • 일반인의 웹 개발일기의 첫 페이지로 이동
반응형

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (47)
    • 사이드 프로젝트 (3)
      • 크롤링 (2)
    • 개발 이야기 (18)
      • MSA (7)
      • Spring Boot (3)
      • JPA (0)
      • Docker (1)
      • Javascript (2)
      • AWS (Amazon Web Services) (5)
      • Jenkins (0)
    • Database (4)
      • PostgreSQL (2)
      • MySQL (1)
      • Oracle (1)
    • 에러 정리 (4)
      • Docker (1)
      • JPA (1)
      • Python (1)
      • PostgreSQL (1)
    • 운영체제 (3)
      • Linux (3)
    • 게임 (8)
      • 마인크래프트(Minecraft) (2)
      • 팰월드(PalWorld) (6)
    • 워킹홀리데이 (6)
      • 일본 워킹 홀리데이 (6)

인기 글

정보

흔하디흔한개발자의 일반인의 웹 개발일기

일반인의 웹 개발일기

흔하디흔한개발자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 흔하디흔한개발자. Designed by Fraccino.

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.