programming/spring_security

[Spring Security] 페이지 로딩에 대해서

labj 2016. 8. 18. 11:48

[Spring Security] 페이지 로딩에 대해서


sample2.zip

1. 페이지 요청하기

sample2 웹프로젝트를 실행시킵니다. 그러면 다음처럼 첫 페이지가 뜨게 됩니다. 


Hello world! 페이지는 웹브러우저에서 웹서버의 / 주소를 요청하면

controller 단에 / 주소와 매핑되어 있는 함수가 실행되어 return 값으로 jsp 파일을 보여주는 것입니다. 


home 함수에서는 현재시간을 model에 serverTime이라는 key값으로 저장해두고 



return 값으로 home을 두어서 /src/main/webapp/WEB-INF/views 디렉토리의 home.jsp를 가져옵니다.


2. jsp 파일 만들기

home.jsp는 다음과 같은 구조를 가집니다.

 

1) jsp 파일을 열면 맨 위에 이 페이지에 대해서 선언을 합니다. java 언어를 사용하며 contentType은 text/html이고

pageEncoding은 UTF-8이라고 선언합니다. 


2) 이 페이지를 누가 만들었는지에 대한 정보를 입력합니다. JSP 에서의 주석은시작하고으로 끝납니다.

 


3) jsp 내에서 Java 코드를 사용 할 수 있습니다.

그렇지만 jsp페이지에서 java 코드을 최대한 줄이기 위하여 JSTL(JavaServer Pages Standard Tag Library)을 사용합니다.

JSTL을 사용하기 위한 선언을 합니다.


 

jsp에서 JSTL로 if문을 사용한다면 다음과 같습니다.

controller 단에서 현재시간을 model에 serverTime이라는 key값으로 저장해서 jsp페이지로 넘겼습니다.

그런데 serverTime에 아무런 값이 담겨 있지 않다면 시간을 표시하지 않도록 하는 것입니다.

 

HomeController 에서 home함수에 formattedDate = null; 이란 코드를 넣습니다.

 

home.jsp에서 시간 표시하는 부분을 다음처럼 수정합니다.


 

웹페이지에서 다시 '/' 를 요청하면 다음과 같이 표시됩니다.


jsp에서 JSTL로 다른 페이지로 이동시키려면 다음처럼 하면 됩니다.

만약에 '/' 로 바로 이동한다면

'/' 주소로 바로 이동합니다. 

 

4) jsp 에서 Spring Security의 기능을 사용하려면 다음과 같이 선언합니다

Spring Security에서 로그인을 하게 되면 로그인 정보를 섹션에 담아 놓게 됩니다.

JSP에서 그 정보를 화면 처리에 이용하기도 합니다.

 

홈페이지에서 로그인을 했는데 다시 로그인페이지로 접속이 된다면 조금 이상할 것입니다.

로그인 정보가 있다면 로그인 페이지로 다시 접속하지 못하도록 JSP에서 처리하려고 합니다.

hasRole('ROLL_USER') 란 로그인한 유저의 권한이 ROLE_USER가 있다면 

<s> 태그안의 <C:redirect url="/" />이 실행되어 메인 페이지로 이동하도록 한 것입니다. 

 

홈페이지에서 로그인을 했을 때와 로그인 후의 메뉴가 다릅니다. 그 경우는 다음과 같이 처리합니다.

isAnonymous()란 권한 정보가 없는 경우를 말합니다. hasRole('ROLL_USER')는 위에서 말한 것처럼 로그인 한 유저가 ROLL_USER 권한이 있는 것입니다.

로그인정보가 있다면 로그아웃 url을 보여주도록 한 것입니다.

 

5) 로그인 페이지로 이동할 수 있도록 a 태그를 만듭니다. 


JSTL의 c:url은 웹서버를 기준으로 url을 생성해 줍니다.

c:url은 value에 '/signin/main'을 넣으면 html 코드가 다음과 같이 생성됩니다.

/sample2는 웹어플리케이션의 path가 붙은 것이고

jsessionid는 톰켓에서 자동으로 생성하는 쿠키 정보입니다. 로그인 처리 등에 사용합니다.


로그인을 클릭하면 controller의 /signin/main url과 매핑되어 있는 함수가 실행되고 

로그인 페이지 정보가 리턴되어 /WEB-INF/views에서 signin 디렉토리의 main.jsp로 이동합니다. 



웹브라우저에 로그인 페이지가 보입니다. 


 

3. 로그인 하기

1) 로그인 페이지

Spring Security에서 로그인 아이디와 비밀번호의 name은 j_username과 j_password로 정해져 있습니다.

 

html에서 class가 loginBtn인 버튼을 클릭하면 자바스크립트가 실행됩니다. 

자바스크립트는 jquery 자바스크립트 라이브러리를 이용합니다.

 

jquery에서 페이지 로딩과 함께 제일먼저 실행되는 영역이 $(document).ready(function()) {  ....  } 안에 있는 코드입니다.

여기에서 class가 loginBtn을 click하면 코드가 실행된다고 미리 자바스크립트를 짜두고 페이지를 로딩합니다.

jquery를 사용하는 jsp 페이지에서 코드가 로딩되어 실행되는 순서입니다.

 

(1) 이용자의 웹브라우저에서 웹서버의 url을 호출합니다.

(2) 웹서버는 url 요청을 controller에 매핑되어 있는 함수를 실행시킵니다.

(3) 함수에서 return 값으로 jsp 파일을 로딩합니다.

(4) jsp 파일에 있는 JSTL이 실행되어 html 코드를 만듭니다.

(5) 생성된 html 코드는 웹서버에서 이용자의 웹브라우저로 전달됩니다.

(6) 웹브라우저는 html 코드의 DOCTYPE을 확인하고 script를 로딩합니다.

(7) jquery를 사용한다면 <script type="text/javascript"> ... </script> 내에서  $(document).ready(function() { ... } 를 먼저 실행합니다.

(8) window.onload = function() { ... } 이 실행됩니다.

(9) 나머지 자바스크립트가 실행됩니다.

 

2) 로그인 유저 정보 설정하기

아이디와 패스워드를 입력하고 로그인 버튼을 클릭하면

com.jobtoy.service.impl.UserDetailsServiceImpl의 loadUserByUsername(String loginid)가 실행됩니다.

여기서 로그인한 유저의 정보를 설정합니다. 

여기서는 테스트로 설정했는데 유저의 정보를 Database에서 가져와 설정하도록 해야 합니다.

 

3) 로그인 성공시

성공적으로 로그인이 되었다면 applicationContext-security.xml에 선언되어 있는


loginSuccessHandler가 실행됩니다.


context에 담겨있는 유저 정보를 가져와서 사용하고


 

로그인 성공후에 돌아갈 url을 설정하여 이동합니다. 여기서는 메인페이지로 이동합니다.




4) 로그아웃

로그아웃 버튼을 클릭하여 로그아웃이 성공하면 applicationContext-security.xml에 선언되어 있는 logoutSuccessHandler가 실행됩니다.


섹션에 담겨있던 로그인 정보를 삭제하고


로그아웃 성공시에 이동할 url을 설정하고 url을 호출하게됩니다.

 

controller에 /signin/signout 과 매핑되어 있는 signin_signout함수가 실행되고 


return값으로 signin 디렉토리의 signout.jsp로 이동합니다. 

5) 로그인 실패시

로그인이 실패하면 applicationContext-security.xml에 선언되어 있는 loginFailureHandler가 실행됩니다.




마찮가지로 로그인 실패시 이동할 url을 설정하고 이동합니다.


로그인 실패를 테스트하기 위해서

com.jobtoy.service.impl.UserDetailsServiceImpl의 loadUserByUsername(String loginid) 에 다음 코드를 수정합니다.

가입여부 확인에서 member.getCusCustStatus가 00이 아니라서 Exception이 발생하게 됩니다. 


그러면 로그인 실패가 되면서 loginFailureHandler에 선언된 /signin/failure 페이지로 이동하게 됩니다.



















[Spring Security] 페이지 로딩에 대해서