똑같은 삽질은 2번 하지 말자
스프링 시큐리티 본문
스프링 시큐리티
애플리케이션에 보안 기능을 구현할 때 사용하는 프레임워크로서, 주로 서블릿 컨테이너에
배포하는 웹 애플리케이션의 보안 기능을 구현할 때 사용한다.
특징
1. 다양한 옵션을 제공
스프링 시큐리티는 기본 구현 클래스의 동작 방식을 커스터마이징할 수 있는 다양한 옵션을 제공한다.
그래서 기본 동작 방식이 보안 요구사항에 부합하지 않더라도 옵션 값을 변경하는 방법으로 요구사항을
충족하도록 설정할 수 있다.
2. 다양한 확장점을 재공
스프링 시큐리티는 동작 방식을 커스터마이징할 수 있는 다양한 확장점을 제공한다. 그래서 기본 동작 방식이
보안 요구사항에 부합하지 않더라도 확장 클래스를 만드는 방법으로 요구사항을 충족할 수 있다.
기능
1. 인증 기능
애플리케이션 사용자의 정당성을 확인한다.
2. 인가 기능
애플리케이션의 리소스나 처리에 대해 접근을 제어한다.
3. 세션 관리 기능
세션 하이재킹(session hijacking)이나 세션 고정(session fixation) 공격으로부타 사용자를 보호하고,
세션의ㅡ 라이프 사이클(생성,파기,타임아웃)을 제어한다.
4. CSRF 방지기능
크로스 사이트 요청 변조(Cross-Site Request Forgery: CSRF) 공격으로부터 사용자를 보호한다.
5. 브라우저의 보안 기능과의 연계기능
브라우저의 보안 기능과 연계해서 브라우저 기능을 악용한 공격에서 사용자를 보호할 수 있는
보안 헤더를 출력한다.
설정
maven
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${org.springframework-version}</version>
</dependency>
root.xml(DI 컨테이너)
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sec="http://www.springframework.org/schema/security"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd
">
<!--인증이 필요없는 리소스에 대한 경로 패턴을 지정 /
밑에 요소보다 먼저 기술한다.(순서대로 경로 패턴을 매칭하기때문에)-->
<sec:http pattern="/resources/**" security="none" />
<sec:http>
<sec:intercept-url pattern="/**" access="isAuthenticated()" />
<sec:form-login/>
</sec:http>
<sec:authentication-manager/>
</beans>
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/security-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>
<!-- 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>
<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>
</web-app>
*이때, 주의해야 할 점이 있다. Spring으로 Web 개발을 할때 웹페이지의 확장자로 .do나 기타 html이나 jsp가 아닌
다른 단어를 사용하는 확장자를 이용할 것이다. 이것을 생각해서 어차피 여기 패턴에 적용된 애들만
Spring Security를 적용할려고 하는 의미에서 /*가 아닌 *.do 를 하는 경우가 있을수 있다. 이렇게 하면 안된다.
Spring Security에서는 내부적으로 작업을 위해 사용되는 URL들이 있는 이 URL들이 뒤에 확장자가 붙는 스타일이
아니다. ( ex_ 로그인 아이디와 패스워드를 입력받아 인증 관력 작업을 하는 URL이 j_spring_security_check 이다.)
그래서 확장자로 패턴을 줄 경우 로그인을 하지 못하는 상황이 발생한다.
설정이 제대로 됬으면, 최상위 페이지에 접근할 때 스프링 시큐리티가 제공하는 로그인 화면이 표시될것이다~~!
'Spring' 카테고리의 다른 글
Jsoup 설치 & Test (0) | 2020.04.16 |
---|---|
Spring css, js, 이미지 등등 resource 파일 불러올때,(<c:url> 필요성) (0) | 2019.11.19 |
DI 컨테이너에서 관리되는 빈에 대한 통합 테스트 (0) | 2019.11.17 |
Mockito(스프링 테스트) (0) | 2019.11.17 |
스프링 테스트 (0) | 2019.11.17 |