[Project] 2차 프로젝트 - 자동 로그인 기능

김호정's avatar
Oct 25, 2024
[Project] 2차 프로젝트 - 자동 로그인 기능
 

자동로그인

 
로그인시 전달받는 토큰만 가지고 있다면 자동 로그인이 가능하게 해준다.
로그인이 필요한 페이지나 서비스에 접근하면 우선 자동 로그인 주소로 토큰을 보내본다.
이때 토큰을 검사하고 유효하면 로그인을 시켜준다.
 
로그인 요청시 로그인한 유저 정보를 가지고 대칭키로 암호화 시켜서 전달했던 토큰을
우리가 받아서 복호화 하고 확인했을 때 해당 유저에게 전달했던 토큰과 일치하면 로그인 시켜주는 것이다.
 
유효하지 않거나 만료시간이 지났다면 로그인 화면으로 보내주면 된다.
 
 
UserController
//자동 로그인 @PostMapping("/auto/login") public ResponseEntity<?> autoLogin(HttpServletRequest request) { String accessToken = request.getHeader("Authorization"); UserResponse.AutoLoginDTO responseDTO = userService.자동로그인(accessToken); return ResponseEntity.ok(Resp.ok(responseDTO)); }
 
컨트롤러에서 받으면 헤더의 Authorization부분, 즉 토큰을 꺼내서 accessToken 변수에 넣고
유저서비스의 자동로그인으로 전달한다.
이후 서비스에서 검증이 끝나면 responseDTO로 리턴한다.
 
 
 
UserService
// 자동 로그인. 토큰을 돌려줄 필요가 없다. public UserResponse.AutoLoginDTO 자동로그인(String accessToken) { Optional.ofNullable(accessToken).orElseThrow(() -> new ExceptionApi401("토큰을 찾을 수 없습니다.")); try { User user = JwtUtil.verify(accessToken); //존재하는 회원인지 확인. id를 꺼내서 존재하는 회원인지 확인 User userPS = userRepository.findById(user.getId()).orElseThrow( ()-> new ExceptionApi401("유저네임을 찾을 수 없습니다") ); return new UserResponse.AutoLoginDTO(userPS); }catch (SignatureVerificationException | JWTDecodeException e1) { throw new ExceptionApi401("유효한 토큰이 아닙니다."); } catch (TokenExpiredException e2){ throw new ExceptionApi401(("토큰이 만료되었습니다.")); } }
 
 
유저서비스에서 토큰만 전달받고 토큰을 복호화 하고 id정보만 꺼내서 유저 객체를 만들어서 리턴한다.
해당 객체에 담겨진 id값으로 db에서 유저를 찾아본다.
존재하는 회원인지 확인하고 시그니처가 다르거나 복호화 한 내용이 우리가 암호화 했을 때와 다르다면 유효하지 않은 토큰이고 토큰을 만들 때 설정한 시간이 지났다면 만료가 뜬다.
 
 
 
토큰을 검증한 JwtUtil
// 검증 코드 public static User verify(String jwt){ //JWT 토큰을 검증할 때는 Bearer을 떼야 한다. jwt = jwt.replace("Bearer ", ""); DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC512(SECRET_KEY)).build().verify(jwt); // TODO: 신민재 추가 // 역할이 USER 인지 확인 String role = decodedJWT.getClaim("role").asString(); if (!"USER".equals(role)) { throw new ExceptionApi400("유효하지 않은 JWT 토큰입니다."); } Long id = decodedJWT.getClaim("id").asLong(); // ID 추출 return User.builder() .id(id) .build(); }
 
 
 
UserResponse의 AutoLoginDTO
// 자동 로그인 record AutoLoginDTO(Long id, String username) { AutoLoginDTO(User user) { this(user.getId(), user.getUsername()); } }
 
 
이렇게 잘 되던 자동 로그인이
 
 
notion image
 
 
 
설정한 토큰 만료시간이 지나면
 
notion image
 
 
만료가 뜬다.
 
 
Share article

keepgoing