관리 메뉴

HAMA 블로그

스프링 시큐리티 기초 따라가기 (2) - Remember Me 본문

Spring

스프링 시큐리티 기초 따라가기 (2) - Remember Me

[하마] 이승현 (wowlsh93@gmail.com) 2015. 7. 14. 17:14

이번 연재에서는 이전에 만들었던 소스에 아래와 같은 기능을 추가할것이다.


Remember Me 기능 

 Remember Me 기능이란 사용자 세션이 종료(디폴트 30분?) 된 후에도 자동으로 로그인 할수있는 기능이다.  
 이것은
추가적인  쿠키를 저장  하는데 , 그 기간(디폴트 2주) 을 정하면 2주동안은 로그인 하지 않고도 인증할수있게된다.  쿠키는 username / expirationTime / password  / key 와  이것들을  MD5 hash 로 인코딩한 정보를  포함한다.Remember Me 는 2가지 방법으로 구현가능한데 , 이 게시물에서는 심플 해쉬 기반 쿠키로 만들었다. 

1. 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-3.2.xsd

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

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

            

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

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

<intercept-url pattern="/resources/**" access="permitAll" />  

<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />  

<form-login login-page="/login"                    

default-target-url="/monitering"          

username-parameter="username"        

password-parameter="password"          

authentication-failure-url="/login?error" 

always-use-default-target='true'           

/> 

<logout invalidate-session="true"   

 delete-cookies="JSESSIONID,SPRING_SECURITY_REMEMBER_ME_COOKIE"  

logout-success-url="/login?logout" /> 


<remember-me key="wmoskey" token-validity-seconds="2419200"/> <!-- 4 주 -->

<!-- enable csrf protection -->

<csrf/> 

</http> 


        <authentication-manager>

    <authentication-provider user-service-ref="memberService"/> 

</authentication-manager>

<beans:bean id="memberService" class="com.company.wmos.auth.MemberService"> 

    </beans:bean>

   

</beans:beans>

설명)

<remember-me key="wmoskey" token-validity-seconds="2419200"/> 를 추가하였다. (한줄이면됨)

key 와 유효기간 4주를 설정하였다.

 delete-cookies="JSESSIONID,SPRING_SECURITY_REMEMBER_ME_COOKIE"  명시적으로 로그아웃

할때는 관련정보를 삭제하게했다.


2. 로그인 페이지에 Remember_me 기능 추가 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<title>마리나 로그인 페이지</title>
<link rel="stylesheet" href="../..//resources/css/login.css">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script type="text/javascript"> 
function doLogin() {
if(frm.j_username.value == "") {
alert("아이디를 입력해주세요.");
return;
}
if(frm.j_password.value == "") {
alert("패스워드를 입력해주세요.");
return;
}
frm.submit();
}
</script>
</head>
<body>
<!--------------------------------- 탑 메뉴  ------------------------------------>
<br>
<br>
<div class="top_menu">
<div class="top_banner_left">&nbsp;&nbsp;<Font style="font-size:30px;">MARINA  <B>전기서비스 현황</B></Font>
&nbsp;&nbsp;&nbsp;&nbsp;
</div>

<!--------------------------------- 로그인 ------------------------------------>

<br>
<br>
<br>
<br>
<br>

<section class="loginform cf">
<form name="frm" action="j_spring_security_check" method="post">
<table>
<tr>
<td>
<ul>
<li>
<label for="userID">ID</label>
<input id = "userID" type="userID" name="username" placeholder="ID" required>
</li>
<li>
<label for="password">Password</label>
<input id = "password" type="password" name="password" placeholder="PASSWORD" required></li>
<li>
<input type="submit" value="로그인" onclick="doLogin()"/>
</li>
</ul>
</td>
</tr>
<tr>
<td>
<input id = "remember_me" name ="_spring_security_remember_me" type = "checkbox"/>Remember me
</td>
</tr>
</table>
<input type="hidden" name="${_csrf.parameterName}"
value="${_csrf.token}" />
</form>

</section>

<c:if test="${not empty error}">
<div class="error">${error}</div>
</c:if>
<c:if test="${not empty msg}">
<div class="msg">${msg}</div>
</c:if>

</body>
</html>

설명) 
<input id = "remember_me" name ="_spring_security_remember_me" type = "checkbox"/>Remember me
달랑 한줄이면된다.


레퍼런스)



Comments