인프런 커뮤니티 질문&답변
작성자 없음
작성자 정보가 삭제된 글입니다.
기억하기 인증 필터(RememberMeAuthenticationFilter) 강의를 듣다가 사소한 궁금증이 생겨 질문드립니다.
작성
·
105
·
수정됨
0
안녕하세요.
기억하기 인증 필터(RememberMeAuthenticationFilter) 강의를 듣다가 사소한 궁금증이 생겨 질문드립니다.
리멤버미 쿠키를 사용시 쿠키를 바탕으로 인증 정보를 가져오는 로직에서, JSESSIONID 쿠키가 만료되었을 때와 서버가 재시작되었을 때 password가 왜 다르게 불러와지는지 알고 싶습니다.
서버 재시작 시 리멤버미 쿠키로 인증 정보가 복구되지 않는 이유를 조사하던 중에 생긴 의문인데요. 제 생각으로는 쿠키에 인증 정보를 담고 있어서, 서버가 재시작되더라도 쿠키가 만료되지 않는 한 인증 정보를 복구할 수 있을 것 같았거든요.
제가 코드를 따라가서 확인한 부분은..
리멤버미 쿠키를 생성할때 맨 마지막 필드로 makeTokenSignature 메서드의 값이 들어가는데
이 값은 String data = username + ":" + tokenExpiryTime + ":" + password + ":" + getKey(); 정보를 조합하여 만들어지는데,
여기서 getKey()는 RememberMeConfigurer에서 init할때 rememberMeServices를 커스텀하게 주입하지 않으면
RememberMeConfigurer에서 UUID.randomUUID().toString()로 가져오기 때문에 서버가 재시작할때마다 랜덤한 값을 가지고 오더라구요.
그래서 서버가 재시작되더라도 고정된 key값을 사용하기 위해 TokenBasedRememberMeService를 생성하여 아래와 같이 설정하였습니다.
이후에 getKey()할때도 key로 test를 가지고 오는것을 확인하였구요.

그러면 이제 key가 고정이기 때문에 서버가 재시작되어도 리멤버미 쿠키를 바탕으로 인증을 진행하여 로그인 없이 세션이 유지될줄 알았는데?!, processAutoLoginCookie 메서드에서 아래 코드에서 exception이 발생합니다..
if (!equals(expectedTokenSignature, actualTokenSignature)) {
throw new InvalidCookieException("Cookie contained signature '" + actualTokenSignature + "' but expected '"
+ expectedTokenSignature + "'");
}
확인해보니 유저 정보를 가져올때 password를 다르게 가져오고있더라구요. TokenSignature는 password와 여러 정보를 조합하여 만드는데, password값이 달라지니 예상값과 실제값이 차이가 나서 exception이 떨어지구요..
UserDetails userDetails = getUserDetailsService().loadUserByUsername(cookieTokens[0]);*로그인 > JSESSIONID 삭제 이후 로그인시
*서버 재시작 이후 로그인시

질문이 좀 장황했는데, 왜 password를 다르게 가져오는지 궁금합니다. 코드를 쫓아가다가 길을 잃어서 도움을 받을수 있을까 하여 질문을 남겨요.. 감사합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
리멤버미(기억하기) 기능과 관련한 귀하의 질문은 스프링 시큐리티에서 토큰 서명이 어떻게 작동하는지에 대한 중요한 부분을 다루고 있습니다. 서버 재시작 시에 비밀번호가 다르게 로드되는 문제는 아래와 같은 몇 가지 요인으로 인해 발생할 수 있습니다.
고정된 Key의 사용:
- 이미
TokenBasedRememberMeService에서 고정된 key를 사용하고 계신 것으로 보입니다. 그러므로makeTokenSignature에서 고정된 key가 사용되어야 서버가 재시작되더라도 동일한 서명이 만들어집니다.
- 이미
비밀번호의 저장 및 로딩 차이:
- 서버 재시작 전후에 비밀번호를 다르게 로드하는 현상은
UserDetailsService에서 사용자 정보를 불러올 때 서로 다른 방식으로 저장된 비밀번호를 반환하는 경우 발생할 수 있습니다. 예를 들어, 비밀번호가 데이터베이스에 다른 형식으로 저장된 경우(예:{noop}접두어가 붙은 평문 비밀번호 또는 bcrypt와 같은 암호화된 비밀번호) 이런 현상이 발생할 수 있습니다.
- 서버 재시작 전후에 비밀번호를 다르게 로드하는 현상은
UserDetailsService 설정 확인:
UserDetailsService가 서버 재시작 전과 후에 동일한 방식으로 사용자 비밀번호를 처리하고 있는지, 그리고 동일한 소스로부터 사용자 정보를 가져오고 있는지를 확인하십시오. 특히, 사용자 정보를 데이터베이스에서 불러오거나 메모리에 저장하는 방식이 달라질 경우 비밀번호가 다르게 로드될 수 있습니다.
기본적으로 리멤버미 기능에서는, 사용자와 비밀번호 관련 정보가 토큰 생성과 인증 과정에서 일관성 있게 유지되어야 합니다. 이를 통해 쿠키의 유효성을 성공적으로 확인할 수 있습니다.
관련 게시물들을 참조하시어 비슷한 문제를 해결하는 데 도움이 될 만한 부분을 확인해 보세요:
- Remember Me: 인증 객체에 대한 구성과 UserDetailsService 사용에 관한 논의가 있습니다.
- Remember-me .CookieTheftException Exception 문의: 쿠키 및 세션과 관련된 예외에 대한 답변이 제공되어 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





