spring security에서 먼저 설정해야 할 것은 권한과 인증입니다.

인증은 로그인처럼 사용자가 맞는지 확인하는 과정이고 권한은 사이트를 사용하는 사용자가 어떤 사용자인지에 따라서 어떤 페이지에 접속할 수 있는지를 제한하는 것입니다. 

결국 권한과 인증은 따로 설명할 수 없는 부분입니다. 주로 권한은 로그인을 하고 난 후에 판단할 수 있는 부분이 될 것이기 때문입니다.

자 우선 기본적인 것을 작성해서 테스트 해보도록 합시다.

spring security 설정파일에서 가장 중요한 태그는 <http>엘리먼트로 (우리는 네임스페이스가 붙어서 <security:http>가 될 것입니다.) 다음과 같이 xml파일에 정의합니다.

<security:http auto-config="true">
	<security:intercept-url pattern="/admin/**"	access="ROLE_ADMIN" />
	<security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http>

 

 

주요 태그

<http>는 웹과 관련된 모든 것을 정의할 수 있는 엘리먼트이며 사용자의 권한을 설정하여 사용자별로 접근할 수 있는 웹 상의 페이지를 제어하거나 로그인과 로그아웃시 처리하고 싶은 기능을 정의할 때 사용합니다.

 

<http>

- auto-config속성 : "true"로 설정하면 기본적으로 로그인페이지, http기본인증

                          로그아웃을 제공

- use-expressions : "true"로 지정하면 Spring EL을 사용한다는 의미

 

 

spring security는 필터 기반으로 동작하며 spring security에서 실행되는 필터만 20개가 넘습니다.

<http>태그의 auto-config속성이 true로 설정이 되면 10개 정도의 필터가 체인으로 만들어져서 동작합니다.

      - SecurityContextPersistenceFilter
      - LogoutFilter
      - UsernamePasswordAuthenticationFilter
      - DefaultLoginPageGeneratingFilter
      - BasicAuthenticationFilter
      - RequestCacheAwareFilter
      - SecurityContextHolderAwareRequestFilter
      - AnonymousAuthenticationFilter
      - SessionManagementFilter
      - ExceptionTranslationFilter
      - FilterSecurityInterceptor

 

auto-config속성을 정의하면 http요청에 대한 기본인증, 로그인페이지에서 인증 처리, 로그아웃을 자동으로 제공한다. 위의 필터가 이러한 작업을 자동으로 하기 위해서 필요한 필터라 생각하면 됩니다.

 

<interceptor-url>

http태그의 하위 엘리먼트로 어떤 페이지를 액세스할 수 있는 권한을 정의하는 엘리먼트입니다.

 

 

pattern :

패턴속성은 제어하고 싶은 path를 등록하여 롤을 정의하는 속성으로 접근할 수 있는 url을 정의

 

access :

access속성에 접근할 수 있는 사용자의 ROLE을 정의 합니다. 이 ROLE은 security에서 제공되는 표현을 사용해야 하며 admin인 경우 ROLE_ADMIN, 일반 USER를 표현하는 것은 ROLE_USER입니다.

 

/admin/**은 요청 path가 /admin/으로 시작하는 모든 요청은 admin인증을 받은 사용자만 접근할 수 있도록 하겠다는 의미입니다.

주의할 사항은 자바에서 try~catch절을 배울때 catch블럭에 정의하는 Exception에서 상위 Exception은 아래쪽에 위치한다 했습니다. 그 이유는 상위 Exception을 위에 정의하면 구체화시키고 싶어도 모두 Exception에서 걸려버리므로 안된다 했습니다. 마찬가지로 /admin/**은 /admin/로 시작하는 요청이지만 /**을 위에 정의해 버리면 /admin도 /**에 속하므로 디테일한 작업을 할 수가 없습니다.

상위가 되는 url을 상단에 정의하지 않습니다.

 

 

 

 

<authentication-manager>

인증과 관련된 내용을 정의하는 엘리먼트입니다. 처음 작업은 테스트이지만 이 부분이 결국 우리가 인증 처리를 위해 구현한 클래스를 정의해야할 부분인 것입니다.

 

<authentication-provider>

<authentication-manager>의 하위 엘리먼트로 인증에 대한 정보를 제공하는 클래스를 정의합니다.

 

<user-service>

<authentication-provider>의 하위 엘리먼트 이며 이 안에 <user>태그를 이용하여 사용자를 지정합니다. 물론 이 부분은 나중에 프로젝트와 연결하면 없어져야 할 부분이 될 것입니다.

 

<user>

<user-service>의 하위 엘리먼트로 인증처리를 할 사용자의 userid와 password를 정의하고 role명을 정의합니다.

특이한점은 id를 id라는 속성으로 정의하지 않고 name이라는 속성으로 처리합니다.

user엘리먼트의 authorities은 각 user의 권한명을 정의하며 위에서 얘기했지만 ROLE_ADMIN, ROLE_USER등을 정의합니다.

 

<security:http auto-config="true">
	<security:intercept-url pattern="/admin/**"	access="ROLE_ADMIN" />
	<security:intercept-url pattern="/**" access="ROLE_USER" />
	
</security:http>
<security:authentication-manager>
	<security:authentication-provider>
		<security:user-service>
			<security:user name="user" password="user" authorities="ROLE_USER" />
			<security:user name="admin" password="admin" authorities="ROLE_ADMIN" />
		</security:user-service>
	</security:authentication-provider>
</security:authentication-manager>

 

 

 

 

설정파일에 대한 설명

설정파일은 두 개의 요청path에 대한 정의만 추가하였습니다. user아이디와 user패스워드를 입력하고 들어오면 일반 user의 roll(ROLE_USER)을 갖게 되고 admin아이디와 admin패스워드를 입력하고 들어오면 admin의roll(ROLE_ADMIN)을 갖도록 <authentication-manager>에서 정의하였습니다. 

이렇게 정의한 권한을 http태그에서 /admin으로 요청하면 admin권한을 갖고 있는 사용자만 접속할 수 있도록, user의 권한을 갖고 있는 사용자는 모든 사이트를 다 사용할 수 있도록 정의하였습니다.

 

이제 서버를 restart하고 우리가 늘 요청하던 대로 kimsaemERP를 요청해 보도록 하겠습니다.

http://localhost:8088/kimsaemERP/index.do로 요청하기

 

주소표시줄도 http://localhost:8088/kimsaemERP/spring_security_login;jsessionid=0EBD89CAAF9AF2CF4053E286A5F798B9로 바뀌어 있습니다.

소스보기로 들어가 보면 아래와 같으며 action에서 /kimsaemERP/j_spring_security_check가 요청되고 있습니다. 입력아이디를 받을 input의 이름은 j_username 패스워드는 j_password라는 것을 알 수있습니다.

이 화면을 알아야 우리가 만드는 화면을 수정할 수 있습니다.

<html><head><title>Login Page</title></head><body onload='document.f.j_username.focus();'>
<h3>Login with Username and Password</h3><form name='f' action='/kimsaemERP/j_spring_security_check' method='POST'>
 <table>
    <tr><td>User:</td><td><input type='text' name='j_username' value=''></td></tr>
    <tr><td>Password:</td><td><input type='password' name='j_password'/></td></tr>
    <tr><td colspan='2'><input name="submit" type="submit" value="Login"/></td></tr>
  </table>
</form></body></html>

 

우리가 이런 페이지를 만든 적은 없지만 spring security 설정파일에 설정한대로 권한에 따라 페이지를 접근할 수 있는지 여부를 판단해야 하므로 spring security내부에서 제공해주는 인증화면(login화면)이 response됩니다.

user/user를 아이디와 패스워드에 입력하면 우리의 첫 페이지로 무사히 접속하는 거죠...

 

그런데 이렇게 되면 안되겠죠....우리 사이트에 녹아져서 연결이 되어야 하고 우리가 만든 로그인 페이지가 보여야 하겠죠?

자 이제 기본 설정을 커스트마이징 하러 갑시당.....

+ Recent posts