-
Spring Security에서 Ajax 권한 검사하는 법백엔드/Spring 2021. 10. 30. 04:44
Spring Security에서
프론트에서 비동기 통신으로 JQuery Ajax 사용하는 경우
권한 체크 시에, 약간 애매하다.
예를 들면
비동기 요청을 하였는데, 세션이 만료된 경우
알림창을 보여주고, 로그인 페이지로 이동해야지
무턱대고 로그인 페이지로 이동할 수는 없다.
결론적으로는
아래의 순서도 대로 되어야한다.
- Spring Security - Ajax 인증검사
이를 추가 개발하기 위해서는 몇 가지 추가로 개발이 필요하다.- Spring Security 추가 설정.
- AjaxAuthenticationEntryPoint 클래스 작성
- Ajax 서버 응답 오류 시, 세션 오류 (만료) 알림창
- 세션 오류 만료 알림창 기능 (옵션)
Spring Security 설정
아래 설정을 추가하여, 인증되지 않은 요청은 AjaxAuthenticationEntryPoint 클래스를 타도록 하자.
@Override protected void configure(HttpSecurity http) throws Exception { // 로그인, 로그아웃 기타 설정 // .... // 인증되지 않은 요청중 AJAX요청일 경우 403으로 응답, AJAX요청이 아닐 경우 login으로 리다이렉트 http.exceptionHandling() .authenticationEntryPoint(new AjaxAuthenticationEntryPoint("/login")); }
AjaxAuthenticationEntryPoint.java
시큐리티 설정에서 연결할 클래스이다.
인증되지 않은 요청은 이쪽으로 들어오도록 하였다.
// 인증되지 않은 요청이 AJAX일경우는 403으로 응답 그외엔 파라메터의 url로 전환. public class AjaxAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint { public AjaxAuthenticationEntryPoint(String loginFormUrl) { super(loginFormUrl); } @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { String ajaxHeader = request.getHeader("X-Requested-With"); // AJAX 요청인지 검사 (헤더 검사, 비동기인지 체크) boolean isAjax = "XMLHttpRequest".equals(ajaxHeader); // 403 Error를 반환한다. if (isAjax) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "세션 만료로 인해서 거부되었습니다."); } else { super.commence(request, response, authException); } } }
Ajax 요청
서버에서 응답한 오류를 적절하게 응답할 수 있도록 한다.
나의 경우는, 모달창을 출력하도록 하였다.
$.ajax({ type: pMethod, url: pUrl, data: pData, datatype: 'json', async: false, // 값을 리턴해주기 때문에 비동기로 하면 안된다. success: function(data){ //... }, error: function (jqXHR, error) { if(jqXHR.status == '403'){ // Spring Server에서 403을 리턴한 경우(AjaxAuthenticationEntryPoint에서 리턴) return invalidSessionModal(); } else{ return errorModal(); } }, complete : function(xhr, status, settings){ //... } });
invalidSessionModal()
서버와 통신 이후, 403 오류가 발생하여 ajax에서 사용하는 함수이다.
나의 경우는, JQuery Modal 플러그인을 사용하여, 모달을 출력했다.
( 이 부분은 필수가 아니기에, 참고용으로 부탁드립니다)
# invalidSessionModal() /* * @methodName : invalidSessionModal() * @author : rojae * @description : 서버와의 통신 이후에, '403' 오류가 발생한 경우 실행. * @return : 모달 출력. */ function invalidSessionModal(){ let modalWrapper = BootstrapModalWrapperFactory.createModal({ message: "세션이 만료되어 로그인 페이지로 돌아갑니다. (권한 부족)", title: "오류", closable: true, closeByBackdrop: true, buttons: [ { label: "닫기", cssClass: "btn btn-primary", action: function (button, buttonData, originalEvent) { return this.hide(); } } ] }); modalWrapper.show(); return mvRoot(); }
- 결과는 아래와 같다.
로그인 한 계정에서 세션을 제거하여 요청한 결과이다.
※ 아래는 JQuery Modal 플러그인이 필요한 분들을 위해서 따로 정리한 글이다.
JQuery Modal Plugin 사용하기 :: 로재의 개발 일기
반응형'백엔드 > Spring' 카테고리의 다른 글
[Spring] AOP 기능을 사용해서, 어노테이션으로 로그를 남기자 (annotation logging) (2) 2022.04.30 [Spring] Servlet 응답, 요청 객체를 얻는 방법 (HttpServletRequest, HttpServletResponse) (0) 2021.11.04 [Spring Security} Spring 3.x에서 mockMvc 테스트 하는 법 (0) 2021.01.15 [Spring JPA] 객체의 상태에 대해서 알아보자 (Transient, Persistent, Detached) (0) 2021.01.12