본문 바로가기
Spring/Spring Security

Spring Web Security 설정하기

by 태옹 2021. 8. 19.

로그인 기능을 사용하는 경우, 웹에서는 기본적으로 쿠키를 이용하거나 세션을 이용하는 방식이 일반적이다.
스프링에서는 이를 Interceptor 등을 이용한 방법으로 처리할 수 있다.

Spring Web Security

https://spring.io/projects/spring-security#overview

 

Spring Security

Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirements

spring.io

해당 문서에서 스프링 웹 시큐리티에 대한 개념을 소개하고 있지만 제대로 감이 오지 않기 때문에..

로그인처리와 CSRF토큰 처리, 암호화 처리, 자동로그인, JSP에서의 로그인 처리와 같이
인증,보안 기능을 사용할 수 있도록 돕는 프레임워크라고 생각하면 될 것 같다.


스프링 시큐리티의 기본 동작 방식은 서블릿의 여러 종류의 필터와 인터셉터를 이용해서 처리된다.

필터 : 서블릿에서 말하는 단순한 필터를 의미
(서블릿 필터 : Client로부터 Server로 요청이 들어오기 전에 서블릿을 거쳐서 필터링 하는 것)
인터셉터 : 스프링에서 필터와 유사한 역할

필터는 서블릿 컨텍스트에 속하긴 하지만 스프링과 무관하여 스프링 내부의 자원들을 활용할 수 없다.
반면에 인터셉터는 스프링 컨텍스트 내에 있는 모든 자원을 활용할 수 있다.

스프링 시큐리티를 이용하게 되면 위와 같이 인터셉터와 필터를 이용하면서 별도의 컨텍스트를 생성해서 처리된다.
하나의 스프링 MVC 프로젝트에 스프링 시큐리티가 적용된다면 다음과 같은 구조가 생성된다.

 

Servlet컨텍스트

스프링 시큐리티는 현재 동작하는 스프링 컨텍스트 내에서 동작하기 때문에 이미 컨텍스트에 포함된 여러 빈들을 같이 이용해서 다양한 방식의 인증 처리가 가능하도록 설계할 수 있다.


Spring Web Security의 설정

1) pom.xml에 dependency 추가

https://docs.spring.io/spring-security/site/docs/5.6.0-M2/reference/html5/

 

Spring Security Reference

In Spring Security 3.0, the codebase was sub-divided into separate jars which more clearly separate different functionality areas and third-party dependencies. If you use Maven to build your project, these are the modules you should add to your pom.xml. Ev

docs.spring.io


스프링 공식 문서에는 spring-security-web만 존재하지만 다양한 처리를 하기 위해 아래와 같이 web,config,core도 pom.xml에 추가하도록 한다. (3개는 모두 동일한 버전일 것)

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-web</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-config</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-core</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency>

JSP에서 스프링 시큐리티 관련된 태그 라이브러리를 활용하기 위해 아래의 spring-security-taglibs도 추가한다.

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs -->
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-taglibs</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency>

(pom.xml의 내용을 수정하면 반드시 maven update 해주기🙋‍♀️)

2) security-context.xml생성

스프링 시큐리티는 단독으로 설정할 수 있기 때문에 기존의 root-context.xml이나 servlet-context.xml과는 별도로 security-context.xml을 작성하는 것이 좋다.
xml이나, Spring Bean Configuration File로 security-context.xml파일을 생성한다.

 

security-context.xml의 위치는 아래의 경로와 같다.

 

작성한 security-context.xml의 namespace에서 security항목을 체크한다.

 

3) web.xml 설정

스프링 시큐리티를 스프링 MVC에서 사용하기 위해 필터를 이용해서 스프링 동작에 관여하도록 설정한다.

<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>


기존에 아래처럼 있었던 것을

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>

security-context.xml의 경로를 추가하여 설정파일의 위치를 알려주는 아래의 코드로 변경해준다.

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/root-context.xml
		/WEB-INF/spring/security-context.xml </param-value>
</context-param>

 

4) 다시 security-context.xml로 돌아와서

스프링 시큐리티가 동작하기 위해서는 Authenrication Manager라는 존재와 스프링 시큐리티의 시작 지점이 필요하기 때문에 위와 같이 최소한의 설정을 지정한 후에 실행한다.

(xml을 이용해서 스프링 시큐리티를 설정할 때 5.0 네임스페이스에서 문제가 발생한다고 함.
<beans> 태그 내용 중에서 -5.0.xsd라고 쓰여진 부분을 제거하고 아래와 같이 수정해주었으니 참고하기)

<?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:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<security:http>
		<security:form-login />
	</security:http>
	<security:authentication-manager>
	</security:authentication-manager>
</beans>


서버를 실행하였을 때 에러가 발생하지 않는다면 스프링 시큐리티의 최소한의 설정은 마무리 된 것이다!

댓글