FRAMEWORK/SPRING

스프링 시큐리티(SPRING SECURITY)

적외선 2016. 10. 5. 11:00

웹 어플리케이션을 개발할 때 보안은 개발자를 힘들게 만드는 것 중 하나입니다.
허가된 사용자만 접근할 수 있도록 하고, 현재 접속하려는 사용자가 누구인지역시 확인해야 하죠.
또 사용자의 비밀번호는 암호화 하여 저장하기도 해야 합니다.

웹 보안은 3가지로 요약할 수 있습니다.

인증 : 현재 사용자가 누구인지 확인하는 과정입니다. 아이디/비밀번호로 인증을 처리합니다.
인가 : 현재 사용자가 특정 url에 사용한 권한이 있는지 검사합니다.
ui처리 : 권한이 없는 사용자가 해다 url에 접근했을 경우 에러화면등을 보여줍니다.

이 세 가지는 웹 어플리케이션마다 고민하게 하는 요소중 하나입니다. 하지만 구현이 쉽지 않죠.

인증은 쉬우나 그 이후의 과정은 쉽지 않습니다.

하지만 스프링 시큐리티(Spring Security)가 제공하는 틀을 사용하고, 각 웹 어플리케이션에 맞게 커스터마이징 한다면 보다 빠르게 구현을 할 수 있습니다.
또한 스프링 시큐리티는 암호화 기능도 제공하고 있기 때문에 사용자의 비밀번호 등을 암호화 하여 보관할 수도 있습니다.
우선 기본적인 세팅이 필요합니다.

세팅은 다음 블로그를 참조하여 진행하였습니다.
http://zgundam.tistory.com/44

기본적인 세팅이 끝나면 각 웹 어플리케이션에 맞게 커스터마이징이 필요합니다.
현재 진행중인 프로젝트의 예제를 보며 실제 프로젝트에 스프링 시큐리티가 어떻게 적용 되는지에 확인해 보도록 하겠습니다.
진행중인 프로젝트의 필요한 기능은 다음과 같았습니다.

1. 슈퍼 관리자는 모든 권한을 다 갖고 있으며, 모든 기능, 모든 메뉴에 접근 가능하다.
2. 그 외 관리자는 슈퍼 관리자가 권한을 설정할 수 있으며, 해당 권한이 있는 경우에만 그 메뉴에 접근 가능하다.

해당 기능을 위해 우선 Spring Security의 설정 수정이 필요했습니다.


context-security.xml1

각 권한별로 접속할 수 있는 url을 설정해주고 모든 url에 슈퍼관리자는 접근이 가능하도록 수정해줬습니다.
다음으로는 사용자가 로그인 했을 때 어떠한 사용자가가 로그인을 하였고, 해당 사용자의 권한은 어떤것들이 있는가를 판단하도록 설정을 해주었습니다.
또한 로그인 시 사용되는 페이지를 지정 해주고, 인증 성공 시 이동 페이지와 인승 실패 시 이동 페이지를 설정해주었습니다.

또 필요한 파일들에 대해 경로를 설정해주었습니다.2


순서대로
1. 현재 로그인 하려는 유저의 인증절차
2. 로그인 성공시 이동
3. 로그인 실패시 이동
4. 비밀번호 암호화
입니다.


스프링 시큐리티에서는 UserDetails라는 인터페이스가 제공 되는데 정의된 메소드와 역할을 도표로 정리하면 다음과 같습니다.3

이 인터페이스를 상속받아 로그인 관련 기능을 구현하도록 도와주는 것이 바로 UserDetailsService입니다.
기본적으로 스프링 시큐리티에서 제공하는 UserDetailsService상속받아 UserDetailsServiceImpl.java 만들어 다음과 같이 기능을 구현하였습니다.

 


UserDetailsServiceImpl.java4


기본적으로 UserDetailsService의 loadUserByUsername이라는 메서드를 상속 받습니다.
이후 loginForm 에서 입력된 adminId를 통해 해당 유저에 관련된 권한을 가져옵니다.
슈퍼 관리자의 경우에는 ROLE_ADMIN이라는 권한을 authorities.add를 통해 저장시켜 주고,
그외의 관리자의 경우에는 슈퍼관리자가 설정해준 권한을 반복문을 통해 저장시켜줍니다.


이후 스프링 시큐리티에서 제공하는 User객체를 통해 인증을 시도하게 되고, 성공시 AuthenticationSuccessHandler를 호출하게 됩니다.
해당 인터페이스를 상속받는 클래스를 만들어서 로그인 이후의 해야할 액션을 설정시켜줍니다.

 

AdminAuthenticationSuccessHandler.java5

필요한 액션들을 한 후 제일 하단 메소드를 통해 지정한 url로 이동을 하게 됩니다.
이미 스프링 시큐리티 설정에서 defulaltUrl에 대해 지정을 해주었기 때문에 해당 url로 이동을 시킵니다.

만약 인증이 실패(로그인 실패) 했을 경우에 AuthenticationFailureHandler를 호출하게 됩니다.
해당 인터페이스를 상속받는 클래스를 만들어서 로그인 이후의 해야할 액션을 설정시켜줍니다.

AdminAuthenticationFailureHandler.java6


로그인 실패 시 어떠한 원인인지에 대해서도 스프링 시큐리티는 지원을 해주고 있습니다.
해당 원인에 대해 정의를 한 후 로그인 실패 페이지로 이동 시킵니다.7


로그인 실패 페이지에서는 원인을 확인하고 해당 값에 맞는 alert창을 띄워줬습니다.

슈퍼관리자가 아닌 그외의 관리자가 로그인을 한 후 권한이 없는 페이지에 접근시에는 accessDenied 에러가 발생하게 됩니다.
말 그대로 권한이 없다는 것입니다. 만약 ui처리를 해주지 않는다면 기본 에러페이지로 표시되게 때문에 권한 확인 후 권한이 없을 시 ui처리가 필요하게 됩니다.
해당 설정 역시 스프링 시큐리티에서 지원하고 있습니다.

 

context-security.xml

8


10

권한이 없을 시 해당 url로 이동을 시켰습니다.

스프링 시큐리티는 보안이라는 이슈를 꽤 편리하게 잡아줄 수 있습니다.
이번 포스트에서는 매우 간단하게 설명을 했고, 많이 빠진 부분이 많기 때문에 스프링 시큐리티를 이해하고 실제로 프로젝트에 적용하기란 쉽지 않습니다.
하지만 스프링 시큐리티가 없었다면 해당 기능 구현을 훨씬 더 어려웠을 것이고, 기본적으로 제공해주는 설정이 매우 다양하고 강력하기 때문에 적절하게 사용한다면 보안에 강력한 웹 어플리케이션을 개발할 수 있을 것 입니다.

출처 - http://changjaeso.com/?p=17435