remember-me 구현 삽질 기록

Kyu·2022년 4월 23일
0

삽질

목록 보기
1/2

시작

일반 회원

  • remember-me를 통해 쿠키 발급

OAuth 회원

  • Refresh token 발급

어쨌든 refresh toekn을 사용하면 JWT 쓸껀데
그럼 일반 회원도 같이 JWT 사용하는 게 낫지 않을까?
그럼 기존에 세션에서 사용하던 모든 코드를 수정해야하므로 따로하는게 낫겠다.

문제

remember-me 사용시에 발급은 잘 되는데
로그아웃할때 자동으로 쿠키가 사라져야하는데
사라지지 않고 무한 리다이렉트 발생.

무한 리다이렉트 발생이유가 remember-me 쿠키가 정상적으로 삭제되지 않아서 계속 로그인 상태를 유지해서이다.
실제로 로그아웃 한다음에 다시 url에 ROLE_USER만 갈 수 있는 /main 으로 접속하면 정상적으로 접속이 된다.

그래서 .deleteCookies("remember-me")를 통해서 remember-me 쿠키를 삭제해줘야하는데 정상적으로 삭제가 안되는 문제 발생.

해결하기

  1. .deleteCookies("remember-me")가 로그아웃 할 때, 정상적으로 작동 되도록 한다.
  2. 정상적으로 deleted 되면 성공

deleteCookies()

메소드 설명에 따르면 Allows specifying the names of cookies to be removed on logout success. 라고 나오는데 remember-me쿠키 설정을 추가했을때 로그아웃이 성공적으로 success 되지 않아서 deleteCookies가 작동하지 않는걸까?

먼저 로그아웃이 정상적으로 되어야하는데 remember-me가 남아있는거 보면 로그아웃 버튼을 눌렀을때 정상적으로 로그아웃이 안되는것 같다.

로그아웃 페이지를 누르면 intro페이지로 가야하는데 login페이지로 이동함 왜??

intro 로 가는 이유는, intro가 ROLE_ANONYMOUS만 가도록 되어있는데,
추측으로
new SecurityContextLogoutHandler().logout(request, response, SecurityContextHolder.getContext().getAuthentication());
여기에서 핸들을 제대로 못해서 로그아웃이 안되는것 같다.

@Override
	public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
		Assert.notNull(request, "HttpServletRequest required");
		if (this.invalidateHttpSession) {
			HttpSession session = request.getSession(false);
			if (session != null) {
				session.invalidate();
				if (this.logger.isDebugEnabled()) {
					this.logger.debug(LogMessage.format("Invalidated session %s", session.getId()));
				}
			}
		}
		SecurityContext context = SecurityContextHolder.getContext();
		SecurityContextHolder.clearContext();
		if (this.clearAuthentication) {
			context.setAuthentication(null);
		}
	}

마지막에 보면 context.setAuthentication(null)인 부분이 있는데 null 된다음에 53번 라인에서 갑자기 authentication이 생김

데모버전이랑 비교해보자

데모버전이랑 비교하니까 문제점이 로그아웃할때 GET으로 하니까 remember-me 쿠키가 삭제가 안됨

Q1) 왜 그런걸까?
아마도 csrf랑 관계가 있는것 같다.

해결

  • logout GET이 아니라 POST로 요청하도록 변경.

로그인 이후 버튼으로 remember-me 만들고 삭제하기

https://github.com/kyupid/spring-security-signup-and-login/commit/87c028461ceec395e3bd1576d913a37b0f37c2d7


어나더 문제

remember-me 가지고 /login 접근시 무한 리다이렉트 발생.

remember-me 토큰을 가지고 있을때 / 로 접근하면 main으로 가야되는데...

remember-me 토큰 없을땐 403받고 기존 페이지가 나옴

profile
TIL 남기는 공간입니다

0개의 댓글