1. 개요

이 예제은 Spring Security 를 사용하여 웹 애플리케이션에서 Remember Me 기능을 활성화하고 구성하는 방법을 보여 줍니다 . Security 및 간단한 양식 로그인으로 MVC 응용 프로그램을 설정하는 방법 은 이미 논의되었습니다.

이 메커니즘은 여러 세션에서 사용자식별 할 수 있으므로 가장 먼저 이해해야 할 것은 Remember Me는 세션 시간이 초과 된 후에 만 ​​시작된다는 것입니다. 기본적으로 30 분 동안 활동이 없으면 발생하지만 web.xml 에서 시간 초과를 구성 할 수 있습니다 .

참고 :이 사용방법(예제)는 표준 쿠키 기반 접근 방식 에 중점을 둡니다 . 지속적인 접근 방식에 대해서는 Spring Security – Persistent Remember Me 사용방법(예제)를 참조 하십시오 .

2. Security 구성

Java를 사용하여 Security 구성을 설정하는 방법을 살펴 보겠습니다.

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean("authenticationManager")
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user1").password("{noop}user1Pass").roles("USER")
            .and()
            .withUser("admin1").password("{noop}admin1Pass").roles("ADMIN");
    }

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/anonymous*").anonymous()
            .antMatchers("/login*").permitAll()
            .anyRequest().authenticated()
            
            .and()
            .formLogin()
            .loginPage("/login.html")
            .loginProcessingUrl("/login")
            .failureUrl("/login.html?error=true")
            
            .and()
            .logout().deleteCookies("JSESSIONID")
            
            .and()
            .rememberMe().key("uniqueAndSecret")
            ;
    }
}

보시다시피 rememberMe () 메서드를 사용한 기본 구성 은 매우 간단하지만 추가 옵션을 통해 매우 유연합니다. 여기서 는 중요합니다. 전체 애플리케이션에 대한 개인 값 비밀이며 토큰의 내용을 생성 할 때 사용됩니다.

또한 토큰이 유효한 시간은 기본 2 주에서 tokenValiditySeconds ()를 사용하여 하루  로 구성 할 수 있습니다 .

rememberMe().key("uniqueAndSecret").tokenValiditySeconds(86400)

동등한 XML 구성을 살펴볼 수도 있습니다.

<http use-expressions="true">
    <intercept-url pattern="/anonymous*" access="isAnonymous()" />
    <intercept-url pattern="/login*" access="permitAll" />
    <intercept-url pattern="/**" access="isAuthenticated()" />

    <form-login login-page='/login.html' 
      authentication-failure-url="/login.html?error=true" />
    <logout delete-cookies="JSESSIONID" />

    <remember-me key="uniqueAndSecret"/>
</http>

<authentication-manager id="authenticationManager">
    <authentication-provider>
        <user-service>
            <user name="user1" password="{noop}user1Pass" authorities="ROLE_USER" />
            <user name="admin1" password="{noop}admin1Pass" authorities="ROLE_ADMIN" />
        </user-service>
    </authentication-provider>
</authentication-manager>

3. 로그인 양식

로그인 양식은 양식 로그인에 사용한 것과 유사합니다 .

<html>
<head></head>

<body>
    <h1>Login</h1>

    <form name='f' action="login" method='POST'>
        <table>
            <tr>
                <td>User:</td>
                <td><input type='text' name='username' value=''></td>
            </tr>
            <tr>
                <td>Password:</td>
                <td><input type='password' name='password' /></td>
            </tr>
            <tr>
                <td>Remember Me:</td>
                <td><input type="checkbox" name="remember-me" /></td>
            </tr>
            <tr>
                <td><input name="submit" type="submit" value="submit" /></td>
            </tr>
        </table>
    </form>

</body>
</html>

새로 추가 된 체크 박스 입력 -remember-me에 대한 매핑을 확인 합니다 . 이 추가 입력은 나를 기억하기가 활성화 된 상태로 로그인하기에 충분합니다.

이 기본 경로는 다음과 같이 변경할 수도 있습니다.

.rememberMe().rememberMeParameter("remember-me-new")

4. 쿠키

이 메커니즘은 사용자가 로그인 할 때 추가 쿠키 인 "remember-me"쿠키를 생성합니다.

기억 나 쿠키는 다음과 같은 데이터를 포함 :

  • 사용자 이름 – 로그인 한 주체를 식별합니다.
  • expireTime – 쿠키를 만료합니다. 기본값은 2 주입니다.
  • MD5 해시 – 이전 2 개 값 – 사용자 이름만료 시간 , 암호 및 사전 정의 된

여기서 가장 먼저 주목해야 할 점은 사용자 이름암호모두 쿠키의 일부라는 것입니다. 즉, 둘 중 하나가 변경되면 쿠키가 더 이상 유효하지 않습니다. 또한 사용자 이름 은 쿠키에서 읽을 수 있습니다.

또한 Remember me 쿠키가 캡처되면이 메커니즘이 잠재적으로 취약하다는 점을 이해하는 것이 중요합니다. 쿠키는 만료되거나 자격 증명이 변경 될 때까지 유효하고 사용할 수 있습니다 .

5. 실제로

기억하기 메커니즘이 작동하는 것을 쉽게 보려면 다음을 수행하십시오.

  • 나를 기억하기 활성 상태로 로그인
  • 세션이 만료 될 때까지 기다리거나 브라우저에서 JSESSIONID 쿠키를 제거합니다.
  • 페이지 새로 고침

활성 상태를 기억하지 않고 쿠키가 만료 된 후 사용자는 로그인 페이지로 다시 리디렉션 되어야합니다 . 나를 기억하면 사용자는 이제 새 토큰 / 쿠키의 도움으로 로그인 상태를 유지 합니다.

6. 결론

이 사용방법(예제)에서는 Security 구성에서 Remember Me 기능을 설정 및 구성하는 방법을 보여 주며 어떤 종류의 데이터가 쿠키에 들어가는 지 간략하게 설명했습니다.

구현은 예제 Github 프로젝트 에서 찾을 수 있습니다. 프로젝트 는 Eclipse 기반 프로젝트이므로 그대로 가져 와서 실행하기 쉽습니다.

프로젝트가 로컬에서 실행되면 localhost 에서 login.html에 액세스 할 수 있습니다 .