Spring Web Security 개념
스프링 시큐리티의 기본 동작 방식은 서블릿의 여러 종류의 필터와 인터셉터를 이용하여 처리한다.
필터는 서블릿에서 말하는 단순한 필터를 의미하고, 인터셉터(Interceptor)는 스프링에서 필터와 유사한 역할을 한다.
필터와 인터셉터는 특정 서블릿이나 컨트롤러의 접근에 관여한다는 점에서 유사하지만 결정적인 차이를 구분하자면
필터는 스프링과 무관하게 서블릿 자원이고, 인터셉터는 스프링의 빈으로 관리되면서 스프링의 컨텍스트 내에 속한다.
스프링 시큐리티를 이용하게 되면 인터셉터와 필터를 이용하면서 별도의 컨텍스트를 생성해서 처리된다.코
스프링 시큐리티는 현재 동작하는 스프링 컨텍스트 내에서 동작하기 때문에 이미 컨텍스트에 포함된 여러 빈들을 같이 이용해서 다양한 방식의 인증 처리가 가능하도록 설계할 수 있다.
실습
- 스프링 레거시 프로젝트로 생성
- java-version : 1.8
- springframework-version : 5.2.14.RELEASE
- springsecurity.version : 4.0.1.RELEASE
- 예제 : http://websystique.com/spring-security/spring-security-4-hello-world-annotation-xml-example/
Spring Security 4 Hello World Annotation+XML Example - WebSystique
This tutorial demonstrates using Spring Security 4 to secure a Spring MVC web application, securing URL access with authentication.
websystique.com
1. 스프링 레거시 프로젝트 생성 (boot X)
2. pom.xml 수정 (버전 관리, dependency 추가)
<properties>
<java-version>1.8</java-version>
<org.springframework-version>5.2.14.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
<springsecurity.version>4.0.1.RELEASE</springsecurity.version>
</properties>
버전 수정
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
<source>여기 1.6->1.8로</source>
<target>위와 동일</target>
Spring Security를 사용하기 위해 dependency 추가
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${springsecurity.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${springsecurity.version}</version>
</dependency>
3. web.xml 에 시큐리티 필터와 스프링 인코딩 필터 등록
<!-- 시큐리티 필터 등록 시작 -->
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 시큐리티 필터 등록 종료 -->
<!-- 스프링 인코딩 필터 등록 시작 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 스프링 인코딩 필터 등록 종료 -->
4. root-context.xml에 security 권한을 설정해준다.
<!-- Security 권한 설정 -->
<security:http auto-config="true" >
<security:intercept-url pattern="/" access="permitAll" /> <!-- 누구나 접근 가능 -->
<security:intercept-url pattern="/home" access="permitAll" />
<security:intercept-url pattern="/admin**" access="hasRole('ADMIN')" />
<security:intercept-url pattern="/dba**" access="hasRole('ADMIN') and hasRole('DBA')" />
<security:form-login authentication-failure-url="/Access_Denied" /><!-- 로그인에 실패하면 Access_Denied로 가라 -->
</security:http>
<!-- Security 권한설정 종료 -->
<!-- Security 사용자 설정 시작 -->
<!-- Security 사용자 설정 시작 -->
<security:authentication-manager >
<security:authentication-provider>
<security:user-service>
<security:user name="user" password="1234" authorities="ROLE_USER" /><!-- 일단 유저 -->
<security:user name="admin" password="1234" authorities="ROLE_ADMIN" /><!-- admin으로 들어갈수도 있고 dba로 들어갈 수 있음 -->
<security:user name="dba" password="1234" authorities="ROLE_ADMIN,ROLE_DBA" /><!-- dba로 들어갈 수 있음 --><!-- 질문 -->
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
<!-- Security 사용자 설정 종료 -->
Namespaces에 security 체크
-> 예제인데 똑같이 하면 에러가 뜰 것이다. 위의 코드처럼 앞에 "security:" 를 붙여준다.
해석
<security:intercept-url pattern="/" access="permitAll" />
<security:intercept-url pattern="/home" access="permitAll" />
-> "/"와 "/home" 을 호출했을 때에 누구나 접근 가능(보안X)
<security:intercept-url pattern="/admin**" access="hasRole('ADMIN')" />
-> url="/admin"에 'ADMIN' 역할을 가진 사람만 접근이 가능하다.
-> 즉 admin역할을 가진 사람은 "/", "/home", "/admin"에 접근이 가능하다는 것을 할 수 있다.
<security:intercept-url pattern="/dba**" access="hasRole('ADMIN') and hasRole('DBA')" />
-> url="/dba" "ADMIN" + "DBA" 역할을 둘다 가진 사람은 /dba에 접근가능하다.
-> 즉 dba와 admin역할을 다 가진 사람은 "/", "/home", "/admin", "/dba"에 접근이 가능하다.
-> dba, admin 역할이라고 했지만 이 단어는 페이지 사용 권한이라고 생각하면 편하다.
<security:form-login authentication-failure-url="/Access_Denied" />
-> 로그인에 실패했을 경우 /Access_Denied로 가라는 뜻이다.
<security:authentication-manager >
-> 여러 권한을 가지는 사용자를 설정하기 위해 필요하다.
<security:authentication-provider>
-> 권한을 제공하겠다.
<security:user-service>
<security:user name="user" password="1234" authorities="ROLE_USER" />
-> db를 사용하지 않고 직접 사용자를 설정하는 것이다. 이름과 비밀번호, 권한을 부여한다.
-> 일반 회원(user)는 ROLE_USER의 권한을 부여받는다.
<security:user name="admin" password="1234" authorities="ROLE_ADMIN" />
-> admin 유저는 ROLE_ADMIN 권한을 부여받는다.
<security:user name="dba" password="1234" authorities="ROLE_ADMIN,ROLE_DBA" />
-> dba 유저는 ROLE_ADMIN,ROLE_DBA 두가지 권한을 부여받는다.
</security:user-service>
이대로 해봤는데 서버가 안 올라오는 오류가 발생한다. 무슨 이유인지는 모르겠지만
web.xml 을 복붙해주면 --> 아래
서버가 잘 올라온다;;
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets
and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<!-- 시큐리티 필터 등록 시작 -->
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 시큐리티 필터 등록 종료 -->
<!-- 스프링 인코딩 필터 등록 시작 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 스프링 인코딩 필터 등록 종료 -->
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
'SpringMVC' 카테고리의 다른 글
Spring Legacy Project (회원관리 - 실습2) (0) | 2021.09.28 |
---|---|
Spring Legacy Project (회원관리 - 실습1) (0) | 2021.09.28 |
Spring Web Security (4) - Oracle 연동 (0) | 2021.09.27 |
Spring Web Security (3) - Custom Login Form(XML) (0) | 2021.09.27 |
Spring Web Security (2) (0) | 2021.09.27 |