본문 바로가기
Spring/Spring Security

[Spring Security] 1. 기본설정 하기

Spring Security를 주제를 여러회차로 나누어서 시리즈 형태로 포스팅을 시작할려고 합니다. 사실 기존의 AOP를 이용한 인증방식을 너무나도 잘 사용하고 있어서 굳이 스프링시큐리티를 따로 사용해야 하나 라는 생각이 있었는데 스프링시큐리티를 파보면서 느낀점은 첫번로 스프링시큐리티가 너무 좋다는 점이였고, 두번째로는 생각보다 많이 어렵구나(복잡하구나)라는 생각이였습니다.

 

그래서 결국 앞으로 스프링시큐리티를 애용해야 겠다는 생각과 함께 한개의 포스팅으로 정리할려고 했던 스프링시큐리티를 시리즈 형태로 나누어서 정리를 하기로 했습니다. 부디 이 포스팅이 스프링시큐리티를 공부하는 분들에게 많은 도움이 되었으면 하는 바램입니다.

 

추가적으로 이 포스팅의 방향을 설명하자면 최종적으로는 스프링시큐리티를 커스터마이징하여 자유자재로 사용하는 수준까지 도달하도록 단계를 점차 높혀가는 방식으로 작성될 예정이며, 아무래도 스프링시큐리티가 스프링내에서도 난이도가 높은 축에 속하는 설정이기 때문에 기본적인 실력을 가지고 있는 분들이 본다고 가정하고 간단한 내용은 가볍게 언급정도만 하고 넘어가겠습니다.

 

 

 

 

 

메이븐(pom.xml) 설정

<!-- 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-core</artifactId>
  <version>${org.springframework-version}</version>
</dependency>

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-taglibs</artifactId>
  <version>${org.springframework-version}</version>
</dependency>

기본적인 메이븐 설정입니다. 
프로퍼티를 따로 기입하지 안아서 보이지 않는데 버전은 5.2.1.RELEASE로 프로잭트의 스프링버전과 동일하게 했습니다. 

 

 

 

 

web.xml 설정

<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.xml의 필터설정 입니다.
보안절차를 위해서는 모든 요청이 spring security필터를 거쳐가도록 해야하니 모든 url요청( /* )에 대하여 필터를 타도록 합니다.


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

저는 스프링 시큐리티의 설정파일을 security-context.xml 라는 이름으로 생성했습니다.
당연히 설정 xml파일을 web.xml에서 등록해 줘야만 합니다. 각자 본인이 생성한 경로와 파일이름을 등록하면 됩니다.

 

 

 

 

 

security-context.xml 작성

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             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">
        
<http auto-config="true" use-expressions="false">
  <intercept-url pattern="/**" access="ROLE_USER" />
</http>

<authentication-manager>
  <authentication-provider>
    <user-service>
      <user name="admin" password="admin" authorities="ROLE_ADMIN"/>
      <user name="user" password="user" authorities="ROLE_USER"/>
    </user-service>
  </authentication-provider>
</authentication-manager>

</beans:beans>

기본적인 스프링시큐리티 설정코드 입니다. 아래에서 코드별로 상세하게 살펴보도록 하겠습니다.

 

 

<http auto-config="true" use-expressions="false">
	<intercept-url pattern="/**" access="ROLE_ADMIN" />
</http>

여러분이 생각하시는 인터셉터 맞습니다. 스프링시큐리티는 인터셉터를 이용하여 권한확인을 합니다.
여기서 /** URL(모든 URL, 참고로 '/'경로는 '/**'에 필터링이 되지 않습니다)에 대한 요청에 대하여 권한체크를 하는데 'ROLE_ADMIN'이라는 권한을 가진사람만 접근이 가능하도록 하는 설정입니다. 자세히 보면 auto-config와 use-expression의 속성과 속성값들이 있는데 이건 나중에 살펴보도록 할께요

 

 

<authentication-manager>
  <authentication-provider>
    <user-service>
      <user name="admin" password="admin" authorities="ROLE_ADMIN"/>
      <user name="user" password="user" authorities="ROLE_USER"/>
    </user-service>
  </authentication-provider>
</authentication-manager>

이 부분은 사용자 계정을 등록하는 부분입니다. 계정이 총 2개가 등록되어 있고 각 계정의 비밀번호와 가지고 있는 권한의 이름이 설정되어 있습니다. 이걸 보는 분들은 난 DB에 있는 계정으로 인증하고 싶은데, 권한의 이름은 내 마음대로 못하나??
권한을 2개 주고 싶은데,,, ㅠㅠ  같은 생각이 들수도 있습니다.

결론만 말씀드리면 가능합니다. 하지만 스프링에서 사용하는 클래스들을 상속받아 자체적으로 커스터마이징하여 새롭게 만들어야 가능하기 때문에 스프링시큐리티 시리즈의 후반부에서 확인해 볼 예정입니다.

결과적으로 지금까지 한 설정에 따르면 모든 url요청(참고로 '/'경로는 '/**'에 필터링이 되지 않습니다)에 대하여 권한체크를 하는데 접근이 가능한 권한의 이름은 'ROLE_ADMIN'이고 이 권한을 가진 계정은 admin에 비밀번호 역시 admin으로 설정되어 있습니다.

 

 

 

 

 

로그인

이제 기본적인 스프링 시큐리티 설정이 모두 끝났습니다. 실제로도 잘 되는지 로그인을 해볼 차례인데 아마 대부분의 분들은 로그인페이지를 아직 안만들었는데 어떻게 로그인을 하지? 라는 생각이 들겁니다.

스프링시큐리티에서는 기본적인 로그인페이지를 제공하기 때문에 보안되는 페이지에 접근을 했을 경우 로그인이 안되어 있다면 자동으로 스프링시큐리티에서 제공하는 기본 로그인페이지로 이동시켜줍니다. 물론 내가 직접만든 로그인페이지로 적용도 가능하지만 그 부분에 대해서는 좀 더 나중에 살펴보도록 하겠습니다.

기본로그인 페이지 입니다. 생각보다 예쁩니다...
context-securit.xml에서 설정한 바에 따르면 여기서 user라는 아이디로 로그인을 한다면 권한이 없으니 접근이 불가능할 것이고 admin으로 로그인한다면 접근이 가능할 것입니다. 바로 admin으로 로그인을 해보도록 하겠습니다.

 

 

There is no PasswordEncoder mapped for the id "null" ??????
아쉽게도 스프링시큐리티 4버전 이후부터는 모든 비밀번호는 암호화를 해야지만 사용이 가능합니다.

 

<authentication-manager>
  <authentication-provider>
    <user-service>
      <user name="admin" password="{noop}admin" authorities="ROLE_ADMIN"/>
      <user name="user" password="{noop}user" authorities="ROLE_USER"/>
    </user-service>
  </authentication-provider>
</authentication-manager>

따라서 암호화를 사용하지 않겠다는 의미로 비밀번호 앞에 {noop}을 추가해줘야만 합니다.
이제 정상적으로 로그인 되는 화면을 확인할 수 있습니다~

댓글