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를 아이디와 패스워드에 입력하면 우리의 첫 페이지로 무사히 접속하는 거죠...
그런데 이렇게 되면 안되겠죠....우리 사이트에 녹아져서 연결이 되어야 하고 우리가 만든 로그인 페이지가 보여야 하겠죠?
자 이제 기본 설정을 커스트마이징 하러 갑시당.....
'보안 > Spring Security' 카테고리의 다른 글
로그인적용하기 - 권한확인 (0) | 2019.09.09 |
---|---|
스프링 시큐리티 제외하기 - 이미지깨짐 해결 (0) | 2019.09.09 |
kimsaemERP의 loginPage로 인증하기 (0) | 2019.09.04 |
spring security를 위한 환경설정 (0) | 2019.09.03 |
Spring Security의 개요 (0) | 2019.08.29 |