복붙노트

[SPRING] CSRF로 로그인 한 후 Spring Security POST redirect를 활성화하는 방법은 무엇입니까?

SPRING

CSRF로 로그인 한 후 Spring Security POST redirect를 활성화하는 방법은 무엇입니까?

CSRF와 함께 Spring Security 3.2를 사용하고 있습니다. 내 구성에는 다음이 포함됩니다.

  <csrf />
  <form-login default-target-url="/defaultPage"/>

사용자가 인증을 요구하는 POST 양식 제출 (CSRF 토큰 포함)을 수행하면 로그인 페이지로 리디렉션됩니다. 그런 다음 요청을 제출하는 대신 Spring Security가 defaultPage로 리다이렉트한다.

문제는 CSRF 토큰이 로그인하는 동안 재설정된다는 것입니다.

로그인 후 어떻게 POST 리디렉션을받을 수 있습니까?

업데이트 : 원래 POST 요청으로 리디렉션 할 사용자 지정 SavedRequestAwareAuthenticationSuccessHandler를 만들려고했습니다. 그러나 원래 요청이 requestCache에 저장되지 않은 것을 보았습니다.

해결법

  1. ==============================

    1.CSRF 보호가 가능할 때 스프링 시큐리티는 요청이 GET 메소드를 사용했다면 requestCache에 원래의 요청만을 넣는 것으로 보인다. POST 요청을 캐시하도록하기 위해 사용자 정의 requestCache를 만들었습니다.

    CSRF 보호가 가능할 때 스프링 시큐리티는 요청이 GET 메소드를 사용했다면 requestCache에 원래의 요청만을 넣는 것으로 보인다. POST 요청을 캐시하도록하기 위해 사용자 정의 requestCache를 만들었습니다.

    나는 그렇게하는 것이 CSRF 보호를 어떻게 든 약화시키지 않는다고 100 % 확신하지는 않지만 내 마음 속에서 안전 해 보인다.

    요청 캐시 빈을 XML 구성에 추가하십시오.

    <bean id="requestCache" class="a.b.c.AlwaysSaveRequestCache" />
    
    <http>
       <csrf />
       <request-cache ref="requestCache" />
    </http>
    

    HttpSessionRequestCache에서 코드를 확장하고 차용하여 사용자 정의 요청 캐시를 구현하십시오.

    public class AlwaysSaveRequestCache extends HttpSessionRequestCache
    {
       @Override
       public void saveRequest(HttpServletRequest request, HttpServletResponse response)
       {
          final String SAVED_REQUEST = "SPRING_SECURITY_SAVED_REQUEST";
          DefaultSavedRequest savedRequest = new DefaultSavedRequest(request, new PortResolverImpl());
          request.getSession().setAttribute(SAVED_REQUEST, savedRequest);
          logger.debug("DefaultSavedRequest added to Session: " + savedRequest);
       }
    }
    

    이제 POST 요청이 캐시되고 로그인 양식에 의해 중단 된 후 다시 보내야합니다.

  2. ==============================

    2.그것은 매우 간단합니다. 숨겨진 형태로 CSRF 토큰을 전달하지 마십시오. 아래처럼 CSRF 토큰을 쿼리 매개 변수로 직접 통과시켜야합니다.

    그것은 매우 간단합니다. 숨겨진 형태로 CSRF 토큰을 전달하지 마십시오. 아래처럼 CSRF 토큰을 쿼리 매개 변수로 직접 통과시켜야합니다.

    <c:url value="/jobseeker/resume/uploadJobSeekerResume1?${_csrf.parameterName}=${_csrf.token}" var="uploadResumeURL"/>
     <form:form action="${uploadResumeURL}" method="post" enctype="multipart/form-data">
                                <input id="file" name="file" type="file" />
                                <div class="modal-footer">
                                <button type="submit"  class="btn btn-success" >
                                    <span class="glyphicon glyphicon-ok-sign"></span>&nbsp;Save
                                </button>
    
                            </div>
                            </form:form>
    
  3. ==============================

    3.왜냐하면 HttpSessionRequestCache와 DefaultSavedRequest는 "multipart / form-data"와 함께 작동하지 않기 때문입니다. 다중 요청은 일반 요청으로 취급되며 모든 양식 데이터가 손실됩니다. SavedRequest에서 복원 된 요청에는 URL과 메소드 만 포함됩니다.

    왜냐하면 HttpSessionRequestCache와 DefaultSavedRequest는 "multipart / form-data"와 함께 작동하지 않기 때문입니다. 다중 요청은 일반 요청으로 취급되며 모든 양식 데이터가 손실됩니다. SavedRequest에서 복원 된 요청에는 URL과 메소드 만 포함됩니다.

  4. ==============================

    4.나는 뭔가를 이해하지 못할 수도 있지만 설정에서 default-target-url을 삭제할 수 없다.

    나는 뭔가를 이해하지 못할 수도 있지만 설정에서 default-target-url을 삭제할 수 없다.

  5. from https://stackoverflow.com/questions/21958224/how-to-enable-spring-security-post-redirect-after-log-in-with-csrf by cc-by-sa and MIT license