티스토리 뷰

Spring으로 웹개발을 하면서 유저에 대한 인증 및 권한처리를 해주어야 할 때가 있다. 아래는 해당 예시다.

 

Authentication(인증) : 인증이 되지않은 유저는 서버에 요청을 보내도 서버에선 요청에 대한 응답을 하지않는다.
(ex. 비 로그인 사용자)

Authorization (인가) : 인증은 되었지만 서버에 요청을 보내도 권한이 없으면 요청에 대한 응답을 하지않는다.
(ex. 일반권한을 가진유저는 관리자권한만이 액세스 할 수 있는곳에 요청을 보내도 정상적으로 응답을 받지못한다)

Spring Boot에서는 이처럼 잘못된 요청을 하게되면 default로 Whitelabel Error Page를 보여주게 된다.

존재하지않는 리소스에 요청을 한다던가, 인증이 되지않은 유저가 요청을 한다던가,


서버에 요청을 보낼때 액세스 할 수 없는 권한을 가진유저가 요청한다던가 등등 이런 예외적인 상황들이 발생시
Whitelabe Page대신 예외에 맞는 페이지를 만들어보자.

 

인증이 되지않은 유저가 요청할 경우, 서버에 요청을 보낼때 액세스 할 수 없는 권한을 가진유저가 요청할 경우
이번장에선 이 2가지 상황에 맞는 작업을 예제코드와 알아보자.

AccessDeniedHandler 와 AuthenticationEntryPoint

Spring Security에서 AccessDeniedHandler인터페이스와 AuthenticationEntryPoint인터페이스가 존재한다.

AccessDeniedHandler는 서버에 요청을 할 때 액세스가 가능한지 권한을 체크후 액세스 할 수 없는 요청을 했을시 동작된다.

AuthenticationEntryPoint는 인증이 되지않은 유저가 요청을 했을때 동작된다.

AccessDeniedHandler 와 AuthenticationEntryPoint 구현체 생성 및 Security Config에 추가

 

SecurityConfig.java 의 Line 47, 48을 주목하자.
/study/list(스터디목록)페이지를 요청할 수 있는 권한은 'ADMIN'과 'USER'이며
/study/regist(스터디등록)페이지를 요청할 수 있는 권한은 'ADMIN'만 가능하다.
즉, 'USER' 권한을 가진 유저는 /study/regist url을 요청할 수 없다.

error page 생성

 

error page를 리다이렉트 하기위한 설정을 추가하였다. /error/경로로 접근시 templates/error폴더에 생성된
error page를 보여주게 될 것이다.

ADMIN 권한, USER 권한 계정생성

ADMIN 권한계정으로 테스트

ADMIN 권한을 가진계정으로는 /study/list, /study/regist 요청시 정상적으로 동작이 되었다.

참고로 Security에서 유저권한에 default로 'ROLE_'가 prefix로 붙게된다.

 

USER 권한계정으로 테스트

USER 권한을 가진계정으로는 /study/list에는 접근하였으나
/study/regist 요청시 권한이 허가되지않아 접근되지 않았다.



이번에는 JESSIONID를 삭제하고 다시 요청해보자.



해당 유저의 인증정보를 쿠키에서 삭제를 해버렸기 때문에 인증이 되지않은채로 요청이 전송되었으니
해당 구현체가 동작이 되면서 403페이지로 리다이렉트가 되었다.

필자가 개발을 진행하면서 고객사의 요구사항중에 이런사항이 있었다.

로그인을 한 뒤 서비스를 이용하는 도중에 세션이 만료되면 alert 경고문구를 띄우고 로그인페이지로 이동을 시켜주세요.

현재 위에 예제코드에서는 세션이 만료가 되면 경고문구가 나오지않고 바로 403페이지로 이동이 된다.
요구사항대로 처리를 하려면 유저가 요청을 하고 응답상태 코드로 401 또는 403 이 리턴되면 해당코드에 따라 분기처리를 해줘야 한다.
하지만 비동기 요청이 아닌 화면이 전환되는 요청일 경우 응답상태코드를 받을 수 없기때문에
비동기 요청시 처리하는걸로 합의를 했다. 이제 구현해보자.



/study/ajax/excelUpload 라는 API를 추가하였다. 페이지 이동url이 아닌 API를 호출할땐 ajax라는 키워드를 붙혔다
세션이 만료되었을때 페이지가 전환되는 요청은 403페이지로, API를 요청할땐 경고문구를 띄워주고(테스트로 콘솔)
로그인페이지로 이동시킨다.



정상적으로 실행이 된 걸 볼수있다.

 

참고로 비동기통신은 fetch API를 사용하였는데 fetch의 catch가 동작되는건줄 알았는데 then구문이 동작된다.

fetch API의 이글을 참조해보자

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
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
글 보관함