꾸물꾸물 졔의 개발공부

[Springboot] JWT(5)_ WebClient 통신 (서버 투 서버)에서 JWT 필터 예외 ( 유효 기간 만료 / 올바르지 않은 값 ) 처리하기 본문

SPRING

[Springboot] JWT(5)_ WebClient 통신 (서버 투 서버)에서 JWT 필터 예외 ( 유효 기간 만료 / 올바르지 않은 값 ) 처리하기

체제 2022. 8. 23. 23:29

  •  내가 한 프로젝트 구조는 , 클라이언트의 요청이 들어오면 서비스 서버가 일차적으로 요청을 받고, 회원의 개인정보와 관련없는 단순 비즈니스 로직은 서비스 서버단에서 처리 .
  • 그 외의 개인정보와 관련된 USER 데이터 는 인증서버에서 처리하도록 하였다.

JWT  필터는 인증서버에 등록해놓았다.

-  WebClient 로 서버 간 통신을 하고 있는데, 필터에서 토큰 유효성에 대한 예외가 발생하면

어떻게 처리하여 서비스 서버로 넘기고 클라이언트에게 응답 할 수 있을까 ? 

 

 

▶ 필터에서 예외를 발생시키면, AuthenticationEntryPoint에서 catch 하고, 또 예외를 발생시켜 webClient 를 전송한 곳 ( 서비스 서버) 에서  catch 하도록 하였다 . 


if(exception.equals(ErrorCode.EXPIRED_TOKEN.getErrorCode())) {
	errorCode = ErrorCode.EXPIRED_TOKEN;
	setResponse(response, errorCode);
	return;
}if(exception.equals(ErrorCode.INVALID_TOKEN.getErrorCode())) {
	errorCode = ErrorCode.INVALID_TOKEN;
	setResponse(response,errorCode);
	return;
}

: AuthenticationEntryPoint 를 구현한 CustomAuthenticationEntryPoint.java 에서 각 예외에 대한 에러코드를 응답 

 

 

 

서비스 서버에서 WebClient 로 인증 서버 통신 

TokenErrorResponse er = new TokenErrorResponse();
try {
	parentInfo= webClient.get().uri("/authentication/parentinfo/"+parent_id)
		.header("Authorization", header)
		.retrieve().bodyToMono(ParentResponse.class).block();
		//토큰사용자가 틀림 
		if(parentInfo.getId().equals("wrong-token")) {
			er.setStatusCode(1000);
			er.setMessage("토큰 사용자 오류");
			data.put("errorInfo", er);
			return data;
		}
		}catch(UnknownHttpStatusCodeException e) {
			int status = e.getRawStatusCode();
			//유효기간 만료 된 토큰 
			if(status == 1001) {
				er.setStatusCode(1001);
				er.setMessage("토큰기한이 만료, 재발급 요청 ");
			}
			//옳지 않은 토큰 
			if(status == 1002) {
				er.setStatusCode(1002);
				er.setMessage("틀린 토큰 or 올바르지 않은 형식");
			}
		}catch(WebClientResponseException e) {
			int status = e.getRawStatusCode();
			er.setStatusCode(status);
			er.setMessage("토큰 값 없음 or 서버 오류");
		}
  • WebClient 를 이용한 서버간 통신에서 요청헤더에서 토큰 값을 얻어왔고, 인증서버로 요청을 전송했다. 

[ 토큰은 존재하나, 올바르지 않은 형태이거나 유효기간 만료 ] 

  • UnknownHttpStatusCodeException 예외를 잡았고, 응답값이 정의되어있지 않은 값 (1001 / 1002 ) 이기 때문.
  •  - 1001 : 유효기간 만료 토큰 , 응답 메세지와 응답 코드 객체 생성 
  •  - 1002 : 유효하지 않은 토큰 , 응답 메세지와 응답 코드 객체 생성 

[ 헤더에 토큰이 존재하지 않거나 ,서버 통신 오류 ] 

  • WebClientResponseException 예외 잡아서 응답 객체 생성 

 

 

TokenErrorResponse.java - 토큰 에러 발생 시, 응답값 담아서 보낼 객체 

@Getter
@Setter
public class TokenErrorResponse {
	//에러코드 : 1001(유효기간 지난 토큰) / 1002 (옳지 않은 토큰)
	int statusCode;
	//에러메세지
	String message;
}