Spring Security
pom.xml Dependency add
security-context.xml 생성 [ servlet-context, root-context 와 별개로 따로 설정한다 ]
Spring security 설정이 MVC에서 사용되기위햐서는 필터를 이용해서 스프링 동작에 관여 하도록 설정합니다.
web.xml 설정
1. security-context.xml 을 읽을수 있도록 지정해주고
2. Filter 를 지정해 줍니다.
3. security-context.xml에서 <security:authentication-manager> 를 생성해줍니다. 해당 태그가 있어야 security-context,xml이 실행됩니다.
시큐리티가필요한 URI 설계
1. /board/all : 로그인을 하지 않은 사용자도 접근 가능한 URI
2. /board/write : 로그인 한 사용자들만이 접근할 수 있는 URI
3. /board/admin : 로그인 한 사용자 중 관리자의 권한을 가진 사용자만이 접근할 수 있는 URI
인증(Authentication) // 권한 (Authorization)
인증 - 자기 스스로가 무언가 자신을 증명할 만한 자료를 제시함
권한 - 남에 의해서 자격이 부여됨
AuthenticationManager
- ProviderManger
- DaoAuthenticationProvider
- CasAuthenticationPrivoider
- 등등
ProviderManager는 인증에 대한 처리를 AuthenticationProvider라는 타입의 객체를 이용하여 처리를 위임한다.
AuthenticationProvider는 실제 인증 작업을 진행한다.
- 이때 인증된 정보에는 권한에 대한 정보를 같이 전달하게 되는데 이 처리는 UserDetailsService 존재와 관련이 있다.
- UserDetailsService 인터페이스의 구현체는 실제로 사용자의 정보와 사용자가 가진 권한의 정보를 처리해서 반환하게 된다.
개발자가 스프링 시큐리티를 커스터마이징 하는 방식은 크게
1. AuthenticationProvider를 직접 구현하는 방식과
2. 실제 처리를 담당하는UserDetailsService를 구현하는 방식으로 나눠진다.
접근권한 설정
<security:intercept-url pattern="" access=""/>
특정 URI로 접근할때 인터셉터를 이용하여 접근을 제어하는 설정으로 pattern는 URI를 의미하며, access는 접속자의 권한을 의미한다.
즉 /board/all 로 접속한 사용자의 경우는 모든 사용자가 접근할수 있고,
/board/write 로 접근한 사람의 경우는 ROLE_MEMBER의 권한이 있는 사용자만 접근이 가능하다.
access의 속성값으로 사용되는 문자열은
1) 표현식과
2) 권한명을 의미하는 문자열을 이용할 수 있다.
access의 다양한 값
authenticated() 인증된 사용자의 접근을 허용
fullyAuthenticated(): 인증된 사용자의 접근을 허용, rememberMe인증 제외
permitAll(): 무조건 허용
denyAll(): 무조건 차단
anonymous(): 익명사용자 허용
rememberMe(): rememberMe 인증 사용자 접근 허용
access(String): 주어진 SpEL표현식의 평가 결과가 true 이면 접근허용
hasRole(String): 사용자가 주어진 역할이 있다면 접근을 허용
hasAuthority(String): 사용자가 주어진 권한이 있다면 허용
hasAnyRole(String...): 사용자가 주어진 어떤권한이라도 있으면 허용
hasAnyAuthority(String...): 사용자가 주어진 권한중 어떤 것이라도 있다면 허용
hasIpAddress(String): 주어진 IP로 부터 요청이 왔다면 접근을 허용
>> 출처: https://fenderist.tistory.com/411 <<
단순한 문자열만을 이용하고 싶은 경우는 use-expression="false"를 지정합니다.
표현식을 사용한 경우
<security:http auto-config="true" use-expressions="false">
<security:intercept-url pattern="/board/write" access="ROLE_MEMBER"/>
<security:intercept-url pattern="/board/update" access="ROLE_MEMBER"/>
<security:intercept-url pattern="/board/admin" access="ROLE_ADMIN"/>
위와 같이 security 설정을 변경한 후에
/board/admin에 접속하게 되면 아래와 같이 로그인 화면으로 이동하게 됩니다.
(신기한것은 아래의 /login 페이지는 만든적이 없는데 말입니다./ 이것은 Spring Security가 기본적으로 제공하는 페이지 입니다.)
추가적인 설정을 통해서 지정된 아이디와 패스워드로 로그인이 가능하게 설정을 해봅시다.
인증과 권한에 대한 실제 처리는 UserDetailsService라는 것을 이용하여 처리하는데 XML에서는 다음과 같이 지정할 수 있다.
여러권한을 가지는 사용자 설정
admin/admin 으로 로그인 할경우 ROLE_MEMBER, ROLE_ADMIN 권한 두개를 가지고 있으므로,
/board/admin 과 /board/wrtie 모두 접속할 수 있다.
member/member로 /board/admin에 로그인 할 경우 아래와 같은 403에러가 발생하게 된다.
접근 제한에 대해서는
1.. 특정한 URI로 지정할 수있다.
2.. AccessDeniedHandler를 직접 구현하거나,
[1번 방법] .특정한 URI로 지정할 수있다.
<security:access-denied-handler />는 org.springframework.security.web.access.AccessDeniedHandler 인터페이스의 구현체를 지정하거나 error-page를 지정할 수 있다. 위의 경우는 /accessError URI로 접근 제한시 보이는 화면을 처리한다.
URI는 변함이 없지만, /accessError 페이지의 내용으로 바뀐것을 확인 할 수 있다.
[2번 방법]
AccessDeniedHandler를 구현한다. 구현하기위해 클래스를 생성해 준다.
AccessDeniedHandler를 구현할경우, 접근 제한이 되었을때 쿠키나 세션에 특정한 작업을 하거나, HttpServletResponse에 특정한 헤더 정보를 추가 하는 등의 행위를 할 경우에는 직접 구현하는 방식이 더 권장됩니다.
security-context.xml 설정을 error-page가 아닌 CustomAccessDeniedHandler를 참조하도록 수정해줍니다.
수정 후 실행하면 /accessError 페이지로 Redirect 하는 것을 확인 할 수 있습니다. (Redirect의 경우는 GET 요청입니다.)
'dev > Spring-security' 카테고리의 다른 글
[Spring] Spring Security 대략적인 흐름 (0) | 2022.08.06 |
---|---|
[Spring] spring security 중간정리 (0) | 2022.08.06 |
[Spring] UserDetailsService 활용 (0) | 2022.08.05 |
[Spring ] JDBC를 이용한 인증/권한 처리 (0) | 2022.08.04 |
[Spring] Spring security - custom login page (0) | 2022.08.02 |