'Spring Security'에 해당되는 글 2건

  1. 2015.12.06 [Spring] 06. Spring security 적용하기 (2) 2
  2. 2015.11.14 [Spring] 06. Spring security 적용하기 (1)

[Spring] 06. Spring security 적용하기 (2)

개발공부/Spring 2015. 12. 6. 15:46

음... 어... 이어쓴다그러고 한달이 지났네요..ㅠ 게을러서 죄송합니다ㅠ

주말되면 그렇게 쉬고싶더라구요ㅠㅠ

변명좀 하자면 운동도 좀 하고 그러면 그냥 쉬고싶어서..ㅠㅠ

바로 시작하겠습니다ㅠ


이전내용 : http://comtk.tistory.com/20


2. 시큐리티 파일 생성


잠시 이전에 올려두었던 'security-context.xml'을 보고가겠습니다.





오늘은 여기서 이 있는 파일들만 설명드리겠습니다.

이전글에 전체 파일들에 들이 막 찍혀있는건 그파일들을 손댔다는뜻인데, http://comtk.tistory.com/10 이 글에 있는 내용의 작업들을 한겁니다. DB가서 데이터 가져오는 작업을 한것이죠. 어떤작업을 한것인지는 설명드리겠습니다.



2-1. CustomizeUserDetailsService


위 이미지에서 맨 아래부분을 확대해보겠습니다.


위 이미지를 보시면 'authentication-provider' 를 보시면 'customizeUserDetailsService라고 되어있습니다.

권한에 대한 처리를 'customizeUserDetailsService'에서 제공받는다는 의미로 생각됩니다.


첫번째 을 보시면 'loginAction 구현' 이라는 주석이 달려있습니다.

저 클래스에서 권한과 로그인에 대한 부분을 같이 처리하고있습니다.


해당 클래스의 내용을 확인해보겠습니다.




위에서부터 차근차근 설명해보겠습니다.

이 클래스는 'UserDetailsService'를 상속받아서 만들어야 합니다.

네 그래야만 해요. 그래야지 저대로 쓸수있어요. 따로 설정을 해주지않으면 스프링은 저 클래스를 사용해서 권한 및 로그인에 대한 처리를 한다고 알고있습니다. 그래서 클래스를 상속받아서 메소드를 입맞에 맛게 오버라이딩 한 후에 사용해야 합니다.


그 다음으로 변수들을 보겠습니다.


이 변수들은 사실 꼭 필요한것은 아니지만.. 잠시후에 계정의 권한을 위해서 만들어둔 변수들입니다.

위에서부터 하나씩 설명하지면 '사용 가능한지', '계정이 만료되지 않았는지', '자격이 만료되지 않았는지', '계정이 잠기지 않았는지' 체크하는 변수들입니다.


그 다음줄은 사용자가 입력한 계정명으로 해당 계정을 찾아서 가져옵니다.

그 아랫줄에서는 그 계정에 대한 상태를 가져와서 if문에서 하나하나 비교해서 상태에 맞게 계정정보를 설정해줍니다.


다음줄로 넘어가겠습니다.



저는 권한을 DB에 저장하여 사용하고있습니다.

DB에서 권한목록을 가져와서 권한을 추가해줍니다. 위 이미지에서 가지고있는 권한중에 'Anonymous'가 있을경우, 권한목록을 따로 생성하지않는것을 볼 수 있습니다. 이는 위 내용은 손님이 아닌 그 이상의 권한을 가진 사람들에 대한 권한처리를 위해 작성된 것임을 알려드립니다. 각 프로젝트의 특성에 맞게 권한을 부여해주시는것이 바람직합니다.


이제 설정한 권한 및 계정상태를 member에 담아서 리턴해줍니다.


이 과정이 끝나면 로그인이 되거나, 로그인에 실패하거나 둘중 하나의 상황을 맞이하게 됩니다.


먼저 성공했을때의 상황을 보겠습니다.



2-2. CustomizeAuthenticationSuccessHandler


맨 위 이미지에서 두번째 에 해당하는 클래스입니다.

로그인이 성공했을 경우를 보여줍니다.



이 클래스 역시 다른 클래스를 상속받아서 사용합니다.

저는 로그에 '성공' 이라는 텍스트를 찍고 메인페이지로 이동하도록 작업했습니다.



2-3. CustomizeAuthenticationFailureHandler


맨 위 이미지에서 세번째 에 해당하는 클래스입니다.

로그인이 살패했을 경우를 보여줍니다.


이 클래스 역시 다른 클래스를 상속받아서 사용합니다.

저는 로그에 '실패' 라는 텍스트를 찍고, 어떤이유로 로그인에 실패했는지 로그를 남깁니다.

이후 페이지는 다시 로그인페이지로 이동합니다.


2-4. encoder


이부분은 따로 파일을 만들지 않고 기본 스프링 인코더를 사용했습니다.

그러나, 따로 암호화 모듈을 사용하여 사용하셔도 됩니다.


'class'부분을 수정하여 사용하시면 됩니다.



3. 부가적인 설정


자 이제, 로그인 및 계정에 대한 권한설정 부분을 하였습니다.

그럼 이제 권한을 사용하여야 하는데... 어떻게 사용할까요...

손님이 접근가능한 부분과, 관리자가 접근가능한부분등 각 권한에 따라 접근 및 행동에 제약이 있어야지, 그렇지않으면 권한이 의미가 없습니다.




을 보시면 '@secured("ROLE_USER")'가 보이실겁니다.

이 한줄로 사용자의 접근을 통제할 수 있습니다.

위 이미지처럼 메소드 위에 써놓으면 해당 메소드는 저 권한이 있는 사용자만 접근이 가능하게 됩니다.

그러나, 메서드별로 해놓으경우 각 메소드마다 다 써줘야하는 번거로움이 있습니다.

class 위에 적어놓으시면 클래스 내의 모든 메소드는 선언되어있는 권한이 있는 사용자만 접근 가능합니다.

그렇기때문에 권한 및 기능별로 클래스를 잘 나누어 사용하는것이 좋습니다.

그럼 한줄만 추가 및 수정하는것으로 사용자의 접근을 통제 가능하게 됩니다.


이외에도 여러가지 설정이 더 있겠지만, 이정도면 기본적인 로그인 및 권한, 접근제어등에 대해서 사용이 가능하다고 생각됩니다. 혹시 내용중에 틀린부분이 있다면 지적해주시면 감사하겠습니다. 그래야 저도 더 공부가 되니까요!!


다음번엔 무엇을 해볼까요.. 뭔가 더 있을텐데... 아참 스프링 4.0이 나왔다는데 그것도 날잡아서 시작해봐야겠어요!!

다른 카테고리도 글을 써야하는데 참... 할게많네요ㅠ 어 어떻게 마무리를 하지.. 음.. 다음에 또 봐요!!

































:

[Spring] 06. Spring security 적용하기 (1)

개발공부/Spring 2015. 11. 14. 20:12

안녕하세요~ 오랜만에 'spring' 에 포스팅하는거같네요ㅠㅠ

사실 제가 시큐리티하다가 멘탈이 깨져서... 거의 못했었어요ㅠㅠ

뭐 다른일도 있긴했는데 그건 다 핑계고 메인은 시큐리티하면서 로그인만드는데 안되서 멘탈나갔지요ㅠㅠ

오랜만에 쓰는데 잘 정리할 수 있을지 모르겠습니다...

일단 시작해볼께요!!


1. 설정


1-1. 파일구조


빨간 점이 찍혀있는 파일 및 폴더는 이번에 설정하면서 수정 혹은 생성되는 파일들입니다.

이전거에 비해서 엄청나게 이미지가 길어졌어요...ㅠㅠ


1-2. security-context.xml


먼저 새로운 파일을 하나 만들꺼에요.

'security-context.xml'을 만들어줍니다.



잘 안보이시죠..ㅠ 눌러서 보세요ㅠㅠ

이거 내용이 짱짱많아요...ㅠㅠ 이거 언제 다하지... 하.. 얄개님이 그림그릴때 이런느낌이었을까ㅠㅠ

얄개님을 안다면 당신은 픽플! ㅋㅋㅋ 정신빠진소리나 하고 않아있지만 이해좀 해주세요.. 이거 어케정리해야할지 막막함 ㅋㅋ


1-2-1. http


자 일단 http 안에 내용들을 설명해볼께요.

이걸 주석안달고 굳이 설명하는 이유는 내가 공부하기위함입니다. ㅋㅋ

많으니까 좀 간략히 설명할께요.


auto-config : 저거를 ture로 하면 아무것도 가장 기본적인 로그인페이지가 생성됩니다. 저는 따로 페이지를 만들었기때문에 false로 했는데 true로 하고 만들어도 상관없어요. 원래는 권한부여에 대한 설정을 하는곳인데 true로 해두시면 그 설정을 기본설정으로 자동으로 설정하겠다는 뜻이 됩니다.


use-expressions : 이건 말로 설명하기가 좀 애매해서 링크를 첨부합니다. http://cafe.daum.net/_c21_/bbs_search_read?grpid=1DpW4&fldid=Pgo7&datanum=1


create-session : 이 값을 never로 셋팅한 경우, 사용자는 권한이 필요한 페이지로 접근시 로그인페이지로 리다이렉트되면서, 로그인하기 전까지 세션아이디가 생성되지 않는다고 합니다. 다른 여러가지 값들이 있읉터인데 찾아보지 않았어요. 필요하신분은 직접 구글링해보시는게 좋을거같습니다.


disable-url-rewriting : url에 jsessionid가 붙는것을 방지해준다.



1-2-2. intercept-url


url 패턴에 대한 설정이 가능합니다.


pattern : 요청을 중간에 가로챌수있는데, 그 가로챙 요정에 대한 패턴을 정의해줍니다. 해당패턴에 일치하면 가로채서 그에맞는 권한을 갖고있는 사용자만 접근 가능하게 할 수 있습니다.


access : 사용자가 접근할 수 있는 권한을 설정합니다. 저는 로그인페이지만 지정해서 모든사용자가 접근 가능하도록 permitAll로 설정하였습니다. 이 역시 다른값들이 많은데, 그에대한건 직접 구글링을 해보시기 바랍니다.



1-2-3. form-login


login form 및 login 자체에 대한 여러가지 설정을 할 수있습니다.


login-page : 로그인 페이지의 url을 설정합니다.


username-parameter : 사용자 계정명을 어떤 파라미터명으로 받을지 설정합니다. 이부분은 나중에 form안에 input 테그의 사용자 계정명을 입력하는부분의 name과 동일해야합니다.


password-parameter : 사용자 계정에 대한 패스워드를 어떤 파라미터명으로 받을지 설정합니다. 이부분 역시 나중에 form안에 input 테그의 패스워드를 입력하는부분의 name과 동일해야합니다.


login-processing-url : 로그인을 처리하는 url입니다.


authentication-success-handler-ref : 로그인 성공시 해당 클래스로 이동하여 성공시에대한 처리를 따로 할 수 있습니다.


authentication-failure-handler-ref : 로그ㅇ니 실패시 해당 클래스로 이동하여 실패시에대한 처리를 따로 할 수 있습니다. (로그남기기, 해당 계정명의 로그인 실패횟수 올리기 등등..)



1-2-4. logout


logout을 할경우 그에대한 설정을 할 수 있는 부분입니다.


invalidate-session : 세션을 삭제할건지 설정합니다.


logout-url : 로그아웃을 실행할 url을 설정합니다. 내용은 따로 구현하지 않아도 무방합니다.


logout-success-url : 로그아웃 성공시 리다이렉트되는 url을 설정합니다.


delete-cookies : jsessionid, remember-me 등 로그인에 관련된 쿠키 및 세션을 삭제합니다.



1-2-5. remember-me


remember-me는 자동로그인에 대한 내용입니다.


token-validity-seconds : 해당 세션을 얼마나 유지할지 설정합니다. 따로 로그아웃하지 않는이상 브라우저를 완전히 닫은뒤에 접근하여도 자동으로 로그인됩니다.


key : 이건 제가 좀 더 알아봐야할거같습니다. 시큐리티도 방금완성한마당에..




1-2-5. authentication-manager


로그인을 어떻게 처리할지에 대해 설정합니다.


authentication-provider에서 설정한 user-service-ref의 id를가진 클래스로 접근하여 로그인을 처리합니다.

로그인을 처리할때 password-encoder에 설정된 encoder를 이용하여 사용자가 입력한 패스워드를 암호화하여 비교하고, 해당 계정에 맞는 패스워드인지 확인합니다.




 1-3. web,xml




web.xml에 스프링 시큐리티를 설정한 파일을 추가해줍니다.


자 이렇게 설정파일은 전부 설정했습니다.

이제 내용만 채우면되는데... 그게 참 쉽지않네요ㅠㅠ

내용채우는 부분은 제가 좀 더 정리한 후에 하는게 나을거같아서 급하게 설정파일만 설정해놓고 마무리합니다.ㅠㅠ

이거한다고 돌아가진않아요ㅠㅠ 왜나면 이건 커스터마이징한상태를 올리는거라 저기서 <beans:bean>의 클래스드를 생성하여 안에 내용을 채워줘야합니다.


기본적인 내용 및 제가 구글링하시라고 했던 내용들은 아래 링크를 걸어둔 블로그에서 확인해보시면 편하실실겁니다!!


가장 기본적인 시큐리티 부분을 하시려한다면 안에 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"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

           http://www.springframework.org/schema/security

           http://www.springframework.org/schema/security/spring-security.xsd">



<http auto-config="true"  use-expressions="true">

<intercept-url pattern="/-" access="permitAll" />
</http>

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


</beans:beans>

이것만 입력하신다음에 해보시면 기본 로그인페이지를 확인하실수 있습니다.

'프로젝트명/spring_security_login' 여기로 접근하시면 됩니다.


나머지내용은 얼른 정리해서 조만간 포스팅하겠습니다!!

다음에 또 뵈요!!






: