From 66672777ac36b337f1cfa79ee76f68ff947b0453 Mon Sep 17 00:00:00 2001 From: minuk926 Date: Thu, 7 Jul 2022 15:26:28 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20cors=20Sesurity=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +++++++++++++++- .../java/com/xit/core/config/SecurityConfig.java | 11 +++++++++++ src/main/resources/config/application-oauth.yml | 2 +- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6ea9a47..fcf08a2 100644 --- a/README.md +++ b/README.md @@ -1 +1,15 @@ -# xit-framework +#### CORS 에러: The request client is not a secure context and the resource is in more-private address space `local`. +```text +공인 IP대역에서 http POST 요청으로 text 타입 데이타 전송시 발생 + +웹서비스를 개발 하던 중 위와 같은 에러를 만났다. +서버 응답에 Access-Control-Allow-Origin: * 와 같은 CORS 허용 헤더를 다 넣어줬지만, +위와 같은 에러가 계속 발생했다. 알고보니 origin 보다, 더 낮은 수준의 네크워크로 요청을 보내는 경우, +위와같이 에러를 발생한다. + +이를 해결하기 위해서는 브라우져 설정에서, 위와 같은 제한을 해제해주어야 한다. +그리고 당연한 소리겠지만, 운영 환경에서는 위와 같은 상황이 발생하면 안된다. + +크롬의 경우: chrome://flags/#block-insecure-private-network-requests 에 들어가서 설정 disabled +엣지의 경우: edge://flags/#block-insecure-private-network-requests 에 들어가서 설정 disabled +``` diff --git a/src/main/java/com/xit/core/config/SecurityConfig.java b/src/main/java/com/xit/core/config/SecurityConfig.java index d17145c..a650abb 100644 --- a/src/main/java/com/xit/core/config/SecurityConfig.java +++ b/src/main/java/com/xit/core/config/SecurityConfig.java @@ -15,6 +15,7 @@ import com.xit.core.oauth2.oauth.handler.TokenAccessDeniedHandler; import com.xit.core.oauth2.oauth.repository.OAuth2AuthorizationRequestBasedOnCookieRepository; import com.xit.core.oauth2.oauth.JwtTokenProvider; import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.security.servlet.PathRequest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; @@ -27,6 +28,7 @@ import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsUtils; @@ -161,6 +163,14 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { */ @Override protected void configure(HttpSecurity http) throws Exception { + /** + * @EnableAsync 설정시 + * SecurityContextHolder의 전략을 선택할 수 있다. + * 기본값은 ThreadLocal 로 동일한 Thread에서만 공유가 가능하다. + * MODE_INHERITABLETHREADLOCAL : 하위 Thread까지 SecurityContext가 공유된다. + */ + SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL); + http .cors() .and() @@ -184,6 +194,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { // GET, POST 요청시 : OPTIONS preflight 요청 - 실제 서버가 살아있는지를 사전에 확인하는 요청 // Spring에서 OPTIONS에 대한 요청을 막고 있어 OPTIONS 요청이 왔을 때도 오류를 리턴하지 않도록 설정 .requestMatchers(CorsUtils::isPreFlightRequest).permitAll() + .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() .mvcMatchers(HttpMethod.OPTIONS, "/**").permitAll() .antMatchers( "/", diff --git a/src/main/resources/config/application-oauth.yml b/src/main/resources/config/application-oauth.yml index e820737..e4852fa 100644 --- a/src/main/resources/config/application-oauth.yml +++ b/src/main/resources/config/application-oauth.yml @@ -68,7 +68,7 @@ spring: # Spring Security cors 설정 :: CorsConfiguration 설정 값 cors: - allowed-origins: http://localhost:3000, http://localhost:8088, http://211.119.124.9 + allowed-origins: http://localhost:3000,http://localhost,http://211.119.124.9 allowed-methods: GET,POST,PUT,DELETE,OPTIONS allowed-headers: '*' max-age: 3600