RememberMe 인증

사용자가 웹 사이트나 애플리케이션에 로그인할 때 자동으로 인증 정보를 기억하는 기능이다

UsernamePasswordAuthenticationFilter 와 함께 사용되며, AbstractAuthenticationProcessingFilter 슈퍼클래스에서 훅을 통해 구현된다

수동으로 id 나 password 를 입력하는 게 아닌 그런 거 없이 자동으로 인증 정보를 처리해주겠다는 기능. 그래서 폼 인증을 처리하는 인증 필터인 UsernamePasswordAuthenticationFilter 와 함께 사용된다. 이 필터가 인증 처리를 할 때 RememberMe 인증 서비스도 함께 처리가 된다는 것을 의미. 그래서 AbstractAuthenticationProcessingFilter 슈퍼 클래스에서 훅을 통해 구현된다. 인증 처리 과정 속에서 이 서비스가 호출된다는 것을 의미. 인증 성공 시 RememberMeServices.loginSuccess() 메소드를 호출해 여기서 RememberMe 토큰을 생성하고 쿠키를 전달한다. 그리고 인증 실패 시 RememberMeServices.loginFail() 을 통해 쿠키를 지우며 인증 성공 시 쿠키를 다시 생성해야 할 것. remeberMe 관련된 쿠키를 생성해 전달하고 실패하면 당연히 인증 자체가 실패했기에 이전 쿠키를 완전히 지워 그 쿠키로 다시 인증이 안되도록 해야할 것. 그리고 로그아웃 필터와 함께 연계해서 로그아웃이 쿠키를 지운다. 로그아웃하면 세션도 만료되고 다 폐기된다. 그때 쿠키도 함께 다 지워져야 한다.

이 기능을 사용하기 위해서는 우리가 id, password 를 넣고 인증 처리를 한다. 이때 내가 기억하기를 사용할 것인가 아닌가를 활성화된게 있어야 하고 체크박스가 있어 내가 RememberMe 기능을 사용하겠다를 체크하고 서버에 요청처리를 해야 그때 토큰 생성에서 쿠키로 다시 클라이언트로 전달될 것. 그래서 유출되더라도 그 안에 있는 값을 해석하거나 알 수는 없다.

토큰 생성

토큰 생성 시 암호된 방식으로 생성되기 때문에 혹시 이 토큰이 유출되더라도 이 토큰으로부터 들어있는 어떤 데이터, 아주 중요한 데이터는 알 수가 없을 것. 단방향이 아닌 해시로 암호화 되기 때문에 양방향으로 암복화 되지 않는다. 다만 유출되면 유출 된 정보 그대로 인증은 될 것. 암호화된 값들은 이렇게 구성된다.

algorithmHex 도 16진수로 해시 된 데이터를 만든다. (username + ":" + expirationTime + ":" password + ":" + key) 이만큼은 암호화되어 만들 거고 이런 정보를 다 합쳐서 최종적으로 base64 로 인코딩한다. 그리고 이 값을 생성해 쿠키로 클라이언트에게 전달한다. expirationTime 으로 만료기간으로 remeberMe 토큰이 만료되는 날짜를 지정할 수 있다. 그래서 밀리초로 표현한다. 그리고 key 는 이 토큰으로 rememberMe 토큰이 변조되거나 수정되는 걸 방지하기 위해서 줄 수 있는 개인키가 될 것. algorithmName 은 어떤 알고리즘을 통해서 토큰을 암호화하겠다고 줄 수 있다. 기본적으로 SHA256 알고리즘을 사용한다. 이렇게 토큰 생성해 클라이언트로 쿠키를 전달하는 것.

RememberMeServices 구현체

다음은 RememberMe Service 구현체를 볼 것. RemeberMe 는 이 기능을 처리하기 위한 서비스를 제공하는데 이건 인터페이스로 두 개의 구현체가 있다. 하나는 TokenBasedRememberMeServices 서비스, 하나는 PersistentTokenBasedRememberMeServices 서비스가 있다.