spring boot와 flutter를 연동한 소셜로그인 구현(feat. spring security)-4

김가빈·2023년 12월 26일
0

springsecurity

목록 보기
23/23

리프레시 토큰 검증

앞 글에서 말했다시피 accessToken검증하는 부분에서 token이 만료될 경우에는 클라이언트에서 refreshToken을 보내주어야 한다.

그리고 서버에서는 이 refreshToken에 대한 검증을 해야한다. refreshToken을 검증하는 부분은 accessToken을 검증하는 filter를 통과하지 못할 것이므로 security에서 무시하도록 설정한다.

설정이 완료되었으면 이제 refreshToken을 검증하는 로직을 작성해보자.

@RestController
@RequestMapping("/api/u/v1")
public class UserController {
	
	private final UserService userService;
	private final SecurityService securityService;
	private final JwtUtil jwtUtil;
	
	private UserController(UserService userService, JwtUtil jwtUtil, SecurityService securityService) {
		this.userService = userService;
		this.jwtUtil = jwtUtil;
		this.securityService = securityService;
	}
	

	@PostMapping("/token")
	public ResponseEntity<Map<String, String>> refreshingAccessToken(HttpServletRequest request) {
		String refreshToken = jwtUtil.extractTokenFromHeader(request);
		jwtUtil.validateRefreshToken(refreshToken);		
		UserDTO userDTO = userService.getUserInfoByUsingRefreshToken(refreshToken);
		Map<String, String> tokenMap = jwtUtil.refreshingAccessToken(userDTO, refreshToken);
		return ResponseEntity.ok(tokenMap);
	}
}
	
	public Boolean validateRefreshToken(String refreshToken) {
		User user = userRepository.findByRefreshToken(refreshToken);
		
		if(user == null) {
			new TokenException(TokenErrorResult.TOKEN_EXPIRED);
		}
		
		String refreshTokenInDB = user.getRefreshToken(); 
		if(!refreshToken.equals(refreshTokenInDB) || checkTokenExpired(refreshTokenInDB)) {
			new TokenException(TokenErrorResult.TOKEN_EXPIRED);
		}
		
		return true;
	}

리프레쉬 토큰으로 유저정보가 있는지, db의 refreshToken정보와 일치하는지, token이 만료되지 않았는지 검증한다.

public Map<String, String> refreshingAccessToken(UserDTO userDTO, String refreshToken) {
		Map<String, String> tokenMap = new HashMap<>();
		String accessToken = generateAccessToken(userDTO);
		
		tokenMap.put("accessToken", accessToken);
		tokenMap.put("refreshToken", refreshToken);
		
		return tokenMap;
	}

리프레쉬 토큰의 인증이 완료되면 refreshToken으로 새로운 accessToken을 발급한다.
만약에 refreshToken도 만료되었다면? 클라이언트에서 로그아웃 요청을 다시 보내고, 서버에서 로그아웃 처리를 해주면된다.

4편에 걸친 플러터와 spring boot를 연동한 소셜로그인 작업이 끝났다. 사실 security를 처음 사용하는 것이라 우여곡절이 많았고, 그래서 기본적인 oauth2로그인과 일반 로그인을 security를 이용해 토이프로젝트로 진행하고 작업을 했다.

플러터개발자가 늘어나고 있는 추세인데, spring boot과 연동한 예시는 많이 없는 것 같았다. 이 글을 참고하는 사람들이 나보다 덜 삽질을 하길 바라며.. 글을 마무리하겠다.

profile
신입 웹개발자입니다.

1개의 댓글

comment-user-thumbnail
2024년 10월 2일

플러터랑 사용한 예시가 많이 없어서 애먹었는데 정말 감사합니다!
코드를 자세히 보고 싶은데 깃허브 주소 알 수 있을까요?

답글 달기