Spring boot Security와 sencha 연동시 고려사항

2024. 8. 3. 22:06Java/Spring Boot Security

1. 'csrf' 정보를 같이 전송하지 않으면, 에러 발생함
특별히 'csrf'와 관련해서 에러에 표시되는 부분이 없음

# html 파일
# 서버에서 csrf 정보를 가져옴
<body>
	<div th:id="${_csrf.parameterName}" th:text="${_csrf.token}" style="display:none"></div>
</body>

# js 파일
# html의 csrf 정보를 참조하여 header에 설정함
form.submit({
	params: {
		'_csrf': document.getElementById('_csrf').innerText
	},
	success: function(form, action) {
	},
	failure: function(form, action) {
	}
});

2. 서버와 연동

성공/실패 handler 추가

	@Bean
	public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
		http.authorizeHttpRequests((requests) -> requests
				.requestMatchers(exceptUrl).permitAll()
				.anyRequest().authenticated())
			.formLogin((form) -> form
				.loginPage("/login")
				.successHandler(customAuthenticationSuccessHandler)
				.failureHandler(customAuthenticationFailureHandler)
				.permitAll())
			.logout((logout) -> logout.permitAll());
		return http.build();
	}

Ajax 여부를 판단해서 결과 처리

private boolean isAjaxRequest(HttpServletRequest request) {
	return "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
}
  
public void onAuthenticationSuccess(생략) {
	생략
    
    // referer 정보가 없는 경우, 메인화면으로 이동하도록 함
	String targetUrl = "/";
	if(savedRequest != null) {
		targetUrl = savedRequest.getRedirectUrl();
	}
        
    if (isAjaxRequest(request)) {
        response.setContentType("application/json;charset=UTF-8");
        response.setStatus(HttpServletResponse.SC_OK);
        JSONObject data = new JSONObject();
        data.put("success", true);
        data.put("msg", "테스트 성공!!");
        data.put("redirect", targetUrl);
        PrintWriter writer = response.getWriter();
        writer.print(data);
        writer.flush();
    } else {
        requestCache.removeRequest(request, response);

        // Proceed with the redirect
        getRedirectStrategy().sendRedirect(request, response, targetUrl);		   
    }
    
    생략
}

서버 결과 받아서 처리

# response.responseText 아래에 서버에서 보낸 json 정보가 있음
# 서버에서 받은 정보를 기준으로 redirect 처리함

form.submit({
	params: {
		'_csrf': document.getElementById('_csrf').innerText
	},
	success: function(form, action) {
		let result = JSON.parse(action.response.responseText);
        window.location.href = result.redirect;
	},
	failure: function(form, action) {
		let result = JSON.parse(action.response.responseText);
		Ext.Msg.alert('Failed', result.msg);
	}
});