Logout을 하지 않고 Jwt가 만료된경우 접속에러

Sol's·2023년 1월 31일
0

팀프로젝트

목록 보기
8/25

로그인, 로그아웃 기능을 구현하고 develop브랜치에 업로드 후 로직이 잘 동작하는것을 확인하고
Main Branch로 push를 했습니다.

이렇게 Cookie와 Jwt를 이용한 로그인이 끝난줄 알았지만, 팀원중 한분이

로그아웃을 하지 않았는데 Jwt가 만료되어 웹 브라우저에 접속이 안됩니다.

라고 말씀해주셨습니다.

임시 해결방안

우선 팀원들이 UI를 띄워서 확인을 할때 작동은 해야하기 때문에
임시방편으로 개발자 도구에 들어가서 쿠키값을 삭제하는 방법을 알려주고
Jwt가 만료되었을때 어떻게 Cookie의 값을 삭제할까? 라는 생각을 해보았습니다.

해결방안

먼저 시도해본것은 Security Filter안에서 예외처리 로직이 작동할때 로그아웃하는 Controller를 DI하여 logout을 시키는 로직을 생각했습니다.

하지만 logout만을 위해 Controller를 DI하는것은 좋은 방안이 아니라고 생각했습니다.
그러다 갑자기 Cookie의 시간을 설정할 수 있는것이 생각났습니다.

쿠키 만료시간 설정

Jwt가 만료되기 전에 Cookie값을 만료시키면, Cookie값이 없어지면서 Security Filter에서 Jwt가 Security ContextHolder에 담기지 않을거라고 생각했습니다.

  • Controller Cookie 만료시간설정
@PostMapping("/view/v1/signin")
    public String login(UserLoginRequest userLoginRequest, HttpServletResponse response) throws UnsupportedEncodingException {

        UserLoginResponse tokens = userService.login(userLoginRequest);

        //cookie 설정은 스페이스가 안되기 때문에 Bearer 앞에 +를 붙인다. Security Filter에서 + -> " " 로 치환할 것이다.
        Cookie cookie = new Cookie("jwt", "Bearer+"+tokens.getAccessToken());
        cookie.setHttpOnly(true);
        cookie.setMaxAge(60 * 29); //초단위 29분설정
        response.addCookie(cookie);
        return "redirect:/view/v1/crews";
    }
  • Jwt 만료시간
private final Long ACCESS_EXPIRATION = 1000 * 60 * 30L; // 30분

public String generateAccessToken(User user) {
        Claims claims = Jwts.claims();
        claims.put(ID_KEY, user.getId());
        claims.put(USERNAME_KEY, user.getUsername());
        claims.put(ROLE_KEY, user.getRole().name());
        claims.put(USERID_KEY, user.getUserId());

        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + ACCESS_EXPIRATION))
                .signWith(SignatureAlgorithm.HS256, SECRET)
                .compact();
    }

위의 상황은 Jwt만료시간이 30분이고, Cookie의 만료시간은 29분입니다.
29분뒤에 Cookie가 만료되어 Jwt가 만료되기 전에 Cookie에 있던 Jwt값이 삭제가 됩니다.

따라서, Cookie가 만료되면 Context Holder에는 인증이 안된 정보가 입력이되어 로그아웃 처리가 됩니다.

아직 팀원들과 Jwt만료시간을 구체적으로 설정하지 않아 30분으로 해놓았습니다.
Redis를 사용하여 RefreshToken을 적용하게 되면 보안을 목적으로 AccessToken의 만료시간을 더 줄이고 Cookie의 만료시간도 줄일 예정입니다.

profile
배우고, 생각하고, 행동해라

0개의 댓글

관련 채용 정보