봄 보안
Spring Security는 J2EE 프로젝트에 포괄적 인 보안 액세스 제어 솔루션을 제공 할 수있는 보안 프레임 워크입니다. 서블릿 필터에 의존합니다. 이 필터는 들어오는 요청을 절단하고 응용 프로그램이 요청을 처리하기 전에 일부 보안 처리를 수행합니다.
Spring Security는 다음과 같이 사용자 요청을 가로 채 웁니다.
배경
전면 및 백엔드에서 분리 된 프로젝트에서 Springsecurity는 보안 프레임 워크로 사용되며 JWT는 RESTful API의 보안을 개선하기 위해 권한 관리를 구현하는 데 사용됩니다. 내가 가장 먼저 한 것은 교차 도메인 문제 였지만 JWT 요청을 전달하는 과정에서 서버는 JWT를 얻을 수 없었습니다.
도메인 교차 도메인 문제
개발 과정에서 나는 CORS (크로스 도메인 자원 공유)의 문제를 만났다. 서버 측에서 단순히 크로스 도메인 액세스를 설정했지만 JWT 요청을 수행하는 과정에서 발생했습니다.
JWT는 요청 헤더에 배치되므로 크로스 도메인 처리는 자체를 설정할 수있는 헤더 필드를 추가하는 것임을 무시합니다.
@ComponentPublic 클래스 CorsFilter는 필터 {logger logger = loggerfactory.getLogger (corsfilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request= (HttpServletRequest) servletRequest; httpservletresponse 응답 = (httpservletResponse) servletResponse; Response.SetHeader ( "Access-Control-Ollow-Origin", request.getheader ( "Origin")); Response.SetHeader ( "액세스-제어-홀로-오리 린", "*"); //response.setheader("access-control-allow-methods",`spost,get, options, delete,put "); // 요청 메소드를 사용할 수있는 요청 메소드. Response.SetHeader ( "Access-Control-Hallow-Headers", "X- recested-With, Cache-Control, Pragma, Content-Type, Authorization"); // 사용 허용 된 요청 메소드 응답 .SetHeader ( "Access-Control-Ollow-Credentials", "True"); // 사용 허용 된 요청 메소드 응답 .SetHeader ( "Access-Control-Ollow-Credentials", "True"); // 확인 정보를 사용하여 요청을 허용할지 여부 FilterCain.dofilter (ServletRequest, ServletResponse); } @override public void destroy () {}} 온라인 검색은 옵션 요청을 처리하고 200을 반환해야한다고 언급했지만 테스트는 작동하지 않았습니다.
여기서 옵션 요청은 실제로 프리 플라이트 요청입니다
프리 플라이트 요청
그러나 다음과 같이 문제가 해결되지 않았습니다
Google 후에 만 프리 플라이트 요청에 대한 정보에 대해 알려져 있습니다.
배경 인터페이스를 호출 할 때 종종 두 번 요청한 것을 알게됩니다. 실제로, 우리가 처음 보내는 것은 프리 플라이트 요청 (프리 플라이트 요청)입니다.
프리 플라이트 요청이 필요한 이유
우리는 모두 브라우저의 동일한 원래 정책이 보안상의 이유로 브라우저가 스크립트에서 시작된 크로스 도메인 HTTP 요청을 제한한다는 것임을 알고 있습니다. xmlhttprequest 및 가져 오기는 모두 동일한 원래 정책을 따릅니다.
브라우저가 크로스 도메인 요청을 제한하는 두 가지 방법이 있습니다.
브라우저는 크로스 도메인 요청 및 크로스 도메인 요청의 발행을 제한합니다. 크로스 도메인 요청은 정상적으로 시작될 수 있지만, 반환 된 결과는 브라우저에서 가로 채 웁니다.
일반적으로 브라우저는 두 번째 방식으로 크로스 도메인 요청을 제한합니다. 즉, 요청이 서버에 도착하여 데이터베이스의 데이터에서 작동 할 수 있습니다. 그러나 반환 된 결과는 브라우저에 의해 가로 채므로 반환 결과를 얻을 수 없습니다. 이것은 실패한 요청이지만 데이터베이스의 데이터에 영향을 줄 수 있습니다.
이런 일이 발생하지 않기 위해 사양에 따라 서버 데이터에 부작용이 발생할 수있는이 HTTP 요청 메소드의 경우 브라우저는 먼저 옵션 메소드를 사용하여 프리 플라이트 요청을 시작하여 서버가 크로스 도메인 요청을 허용하는지 여부를 알아야합니다. 허용 된 경우 데이터로 실제 요청을 보내십시오. 허용되지 않으면 데이터와 함께 실제 요청을 보내지 않도록하십시오.
브라우저는 CORS 요청을 간단한 요청과 비소 요청의 두 가지 범주로 나눕니다.
간단한 요청
1. 요청 방법은 다음 세 가지 방법 중 하나입니다.
2. HTTP의 헤더 정보는 다음 필드를 초과하지 않습니다.
동시에 위의 두 조건을 충족하지 않는 사람은 단순한 요청입니다.
브라우저는이 두 요청을 다르게 처리합니다.
간단한 요청이 없습니다
비소 요청은 요청 메소드를 넣거나 삭제하는 것과 같이 서버에 대한 특별한 요구 사항이있는 요청 또는 컨텐츠 유형 필드 유형이 Application/JSON입니다.
간단한 요청이 아닌 CORS 요청은 공식 커뮤니케이션 전에 HTTP 쿼리 요청을 추가합니다.이 커뮤니케이션은 "Preflight"요청 (Preflight)이라고합니다.
CORS에 대한 자세한 내용은 하단의 링크를 참조하십시오.
해결책
우리의 배경에서 Spring Security는 보안 프레임 워크로 사용되며 Preflight 요청에 해당하는 처리가 이루어지지 않으므로이 요청으로 권한 제어가 실패합니다.
처리하는 것도 매우 간단합니다. 스프링 보안 구성 클래스 구성 메소드에 릴리스 프리 플라이트 요청을 추가하면됩니다.
@override protected void configure (httpsecurity http)는 예외 {http // 우리가 JWT를 사용하기 때문에 csrf .csrf (). disable () // token을 기반으로 할 필요가 없으므로 세션 (sessionmanagement). sessioncreationpolicy (sessioncreationpolicy.stationseless). 모든 요청/requestmatchers (corsutils :: ispreflightrequest) .permitall () // preflight.antmatchers ( "/*"). henmitall () .antmatchers ( "/u"). denyall () .antmatchers ( "/article/**"). .AntMatchers ( "/api/**"). permitAll () .AntMatchers ( "/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**" ,"/swagger-ui.html", "/webjars/**") .AntMatchers ( "/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/__"/swagger-ui.html", "/webjars/**") .permitall () .antmatchers ( "/manage/**") 위의 요청은 authentication.anyRequest (). authenticated (); // 캐시 비활성화 http.headers (). cachecontrol (); // JWT 필터 추가 http.addfilterbefore (authenticationTokenFilterBean (), usernamepasswordauthenticationFilter.class); // 승인되지 않은 처리 추가 http.exceptionHandling (). AuthenticationEntryPoint (getAuthenticationEntrypoint ()); // 불충분 한 권한이 http.exceptionhandling (). AccessDeniedHandler (getAccessDeniedHandler ()); }문제가 마침내 해결되었습니다!
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.
참조 :
프론트 엔드 | 프리 플라이트 요청에 대한 간단한 토론
크로스 도메인 리소스 공유 CORS 세부 설명