티스토리 뷰

Spring

Spring Security Custom EntryPoint

Jodu 2016. 12. 28. 00:07
반응형

서론

Spring을 사용하면 Spring Security를 사용해서 보안을 설정 할 수 있다. Spring Security을 적용하면 프레임워크 상에서 기본적으로 설정된 내용을 바탕으로 동작하게 된다. 예를 들어 로그인 하지 않은 사용자가 권한이 맞지 않는 페이지에 접근하면 자동적으로 Login 양식이 있는 화면으로 리다이렉트 시켜버리는 경우가 있다. 

이 경우 일반 JSP로 구현을 한다면 상관이 없지만 Back-End와 Front-End간의 JSON을 통신하는 경우에는 문제가 발생한다. Front-End의 소스에서 Html Tag로 이뤄진 응답결과를 제대로 파싱할 수 없어서 에러를 만들어 내게 된다.

이번 포스팅에서는 이러한 문제점을 해결하는 법에 대해서 설명한다.


문제점에 대한 확인

로그인 하지 않은 사용자가 Back-End API를 호출하게 되면 기존 설정을 가진 Spring Security가 응답 결과로 Login관련 HTML DOM을 주기 때문에 이것을 그대로 받는 Front-End에서 오류가 발생하게 된다.

 


[그림1] 기본 설정에 의한 Login Form 응답 결과


위와 같이 detail?boardNum-9에 대한 호출을 하였지만 로그인 되지 않은 사용자의 접근에 의해 Login 폼을 응답 결과로 받은 클라이언트는 JSON 파싱 관련 에러를 나타내면서 동작을 하지 않게 된다.

이러한 문제점을 해결 하기 위해서는 로그인 하지 않은 사용자의 접근시에 JSON으로 응답 결과를 반환 할 수 있도록 직접 구현 및 설정을 해주어야한다.


AuthenticationEntryPoint의 구현 및 설정

먼저 JSON으로 응답 결과를 반환 하기 위해서는 AuthenticationEntryPoint 인터페이스를 구현하여야 한다. 해당 인터페이스에는 commence(HttpServletRequest, HttpServletResponse, AuthenticationException): void 메소드가 하나 존재하며 해당 메소드의 HttpServletResponse에 결과로 반환하고자 하는 내용을 넘겨주면된다.

위에서 보이는 LoginResultOutputHandler는 Map의 값을 JSON으로 변경하여 HttpServletResponse의 stream에 write하는 기능을 구현한 클래스이다.

이렇게 CustomAppEntryPointHandler를 구현을 하고 나면 Spring Security 프레임워크에서 동작할 수 있도록 설정을 해주어야 하며 본 포스팅에는 Java Config방법을 사용하였다.


여러가지 설정 내용들이 있지만 여기서는 설명을 생략하고 마지막 exceptionHandling().authenticationEntryPoint(entryPointHandler)를 설정해줌으로서 CustomAppEntryPointHandler가 로그인 하지 않은 사용자의 API접근시 Login 폼의 결과가 아닌 JSON 결과를 응답으로 전달하게 설정이 된다.
만약 xml 설정 방식을 사용한다면 http Tag의 속성인 entry-point-ref에 빈 id명을 지정함으로서 설정을 할 수 있다.

동작확인

위의 결과를 보면 이전에는 로그인 되지 않은 사용자의 접근에 결과로 Login 폼을 받았지만 이번엔 서버에서 정의된 JSON을 결과 값으로 받아내고 그 결과값에 의해 Front-End에 정의된 로그인 화면으로 리다이렉트된 결과를 확인 할 수 있다.




반응형

'Spring' 카테고리의 다른 글

Spring User Transactional Annotation  (0) 2017.03.25
Spring HttpSessionListener  (2) 2017.03.25
JUnit 테스트 시 Spring 구동 및 Autowired하는 방법  (0) 2016.11.15
Spring Bean Scope  (0) 2016.10.11
SVG 이미지 변환 서버 만들기  (0) 2016.09.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함