스프링 시큐리티는 지금까지 직접 구현해왔던 아이디/비밀번호를 입력하고 로그인하여 사용자를 인증(Authentication)하고, 로그인후 프로그램의 각각의 기능에 대한 권한을 체크(Authorization)하는 작업을 구현해둔 보안 프레임웍 입니다.
프로그램외에 리소스(이미지 등)에 대한 접근도 제어할 수 있고, CSRF(Cross Site Request Forgery) 공격 방어, 세션 고정(Session Fixation) 공격 방어 및 다중 접속 방지 등도 간단하게 구현할 수 있습니다.
이제부터 스프링 시큐리티를 사용하는 방법에 대해 알아 보도록 하겠습니다. 이 글에서는 스프링 시큐리티 4.2.1 버전으로 테스트 해 봅니다.
1. 의존성 등록(pom.xml)
스프링 시큐리티 라이브러리를 포함 시킵니다.
<-- 최소 의존성 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>
2. 필터를 등록합니다.(web.xml)
스프링 시큐리티는 서블릿 필터로 동작을 하여서 요청의 앞단에서 필요한 체크를 수행합니다.
<!-- Spring Security -->
<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>
3. 스프링 시큐리티 설정파일 로딩하도록 지정(web.xml)
스프링 시큐리티에 사용되는 빈들을 위한 설정파일을 스프링 프레임웍이 읽어들이도록 설정 파일 지정을 추가 합니다. security-context.xml 파일 입니다.
<!-- 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
/WEB-INF/spring/security-context.xml
</param-value>
</context-param>
4. 스프링 시큐리티 <http> 설정(security-content.xml)
최소한의 설정으로 스프링 시큐리티가 제공하는 기본 기능을 확인해보겠습니다.
<http>
<intercept-url pattern="/**" access="hasRole('USER')" />
<form-login />
<logout />
</http>
<!-- provider -->
<authentication-manager>
<authentication-provider>
<user-service>
<user name="user" password="password" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
5. 로그아웃 기능 입니다.(home.jsp)
<form:form action="${pageContext.request.contextPath}/logout" method="POST">
<input type="submit" value="로그아웃" />
</form:form>
6. 기본설정으로 실행해본 화면입니다.
로그인 화면은 직접 만들지 않았지만 기본값으로 스프링 시큐리티가 제공해주는 것이 보여집니다.
7. 설정을 알아보겠습니다.(security-content.xml)
설정파일 내의 <http> 요소에서 웹 관련 기능을 설정합니다. 최소 설정이므로 기본값들이 많이 사용되었습니다. 위의 설정에서 사용된 기본값들을 더 적어 보면 다음과 같을 것입니다.
<http use-expressions="true">
<intercept-url pattern="/**" access="hasRole('USER')" />
<form-login login-page="/login" />
<logout logout-url="/logout" />
<csrf disabled="false"/>
</http>
use-expressions 속성은 <intercept-url>의 access 속성에 표현식을 사용할 수 있다는 뜻입니다. 이 값이 "false"이면 access="USER" 로 값을 바로 사용해야 합니다.
<intercept-url> 요소는 pattern 속성으로 주어인 URL 에 대해 access속성의 권한을 요구합니다. 위의 의미는 모든 URL(/**)을 보호하고, 액세스하기 위해서는 ROLE_USER 역할을 요구합니다. 접두어 "ROLE_" 가 없어도 동일한 의미 입니다.(접두어를 붙여도 됩니다.)
<intercept-url>요소는 서로 다른 요구사항을 나타내는 여러개가 나올 수 있습니다. 여러개가 나올 경우 순서대로 매칭되어져서 첫번째가 매칭된것이 사용되어 집니다. 그러므로 가장 특수한 경우를 위쪽에 놓고 일반적인 경우를 아래쪽에 놓아야 합니다.
<form-login> 요소는 로그인을 위해서 폼을 사용합니다. 로그인처리 URL의 기본값은 "/login" 입니다.
<logout> 요소는 로그아웃 URL을 제공한다는 뜻입니다. 기본값은 "/logout" 입니다.
<csrf disabled="false"/> 는 CSRF(Cross Site Resquest Fosery) 공격을 방어하기 위한 처리를 하겠다는 뜻입니다. 이게 기본값입니다. CSRF 방어를 위해 POST 방식으로 값을 넘기는 곳에는 모두 <input name="_csrf" type="hidden" value="ae10ba14-8ca9-4171-9f0d-dd472321a08d" /> 와 같은 숨겨진 값을 보내게 됩니다.
프로바이더 부분은 <user name="user" password="password" authorities="ROLE_USER" /> 부분에서 사용자 정보를 제공하고 있습니다. 실제로 사용할때는 이 정보를 데이터베이스에서 가져오도록 설정하게 될것 입니다.
CSRF 방어를 사용하도록 되어 있다면 로그아웃을 POST 방식으로 해야 합니다. CSRF 방어를 사용하지 않도록 되어있다면 GET 방식도 되므로 단순 링크로 처리할 수 있습니다.
<a href="<c:url value='/logout' />">로그아웃</a>
지금까지 스프링 시큐리티를 최소기능만을 가지고 테스트해보았습니다. 이걸 가지고 아직 할 수 있는게 없습니다. 앞으로 조금씩 알아나가도록 하겠습니다.
※ 소스
참고자료 : http://docs.spring.io/spring-security/site/docs/4.2.1.RELEASE/reference/htmlsingle/
스프링 시큐리티에서 중복 로그인 방지 및 세션 고정 공격 방지
전자정부표준프레임워크 Spring Security 사용시 로그인한 사용자정보에 추가정보 넣기
Srping Security 권한 직접 체크하기(시큐리티 태그와 인증 클래스)
CKEditor 이미지 업로드에 Spring Security CSRF 토큰 적용하기
전자정부표준프레임워크 Spring Security 설정 간소화에서 CSRF 설정하기
스프링프레임웍 - Spring Security(3) : 사용자/권한 정보 DB사용하기
'프로그래밍 > 스프링프레임워크' 카테고리의 다른 글
스프링프레임웍 - Spring Security(3) : 사용자/권한 정보 DB사용하기 (15) | 2018.04.09 |
---|---|
스프링프레임웍 - Spring Security(2) : 커스텀 로그인 화면 및 권한에 따른 접근 제어 (0) | 2018.04.08 |
전자정부 표준프레임워크 - Portal Site 로깅(log4j 2) 설정하기 (0) | 2018.04.08 |
전자정부 표준프레임워크 - Portal Site에 메뉴관리, 코드관리 추가하기 (0) | 2018.04.08 |
전자정부 표준프레임워크 - CKEditor 적용하기 (0) | 2018.04.08 |