Spring Cloud로 개발하는 MSA/UserMicroservice(2)

ch05. Users Microservice - AuthorizationHeaderFilter 추가

webmaster 2022. 2. 2. 16:50
728x90

https://jwt.io/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

Gateway AuthorizationHeaderFilter 추가

  • @Component
    @Slf4j
    @RequiredArgsConstructor
    public class AuthorizationHeaderFilter extends
        AbstractGatewayFilterFactory<AuthorizationHeaderFilter.Config> {
    
        private final Environment env;
    
        //login -> token -> users(with token) -> header(include token)
        @Override
        public GatewayFilter apply(Config config) {
            //토큰이 잘 발행이 되었는지를 판단하는 필터
            return ((exchange, chain) -> {
                ServerHttpRequest request = exchange.getRequest();
                if (!request.getHeaders().containsKey(AUTHORIZATION)) {
                    return onError(exchange, "no authorization header", UNAUTHORIZED); //적절한 헤더가 없을 경우
                }
                String authorizationHeader = request.getHeaders().get(AUTHORIZATION)
                    .get(0); //토큰을 가지고 온다
                String jwt = authorizationHeader.replace("Bearer", "");
                if (!isJwtValid(jwt)) {
                    return onError(exchange, "JWT token is not valid", UNAUTHORIZED);
                }
                return chain.filter(exchange);
            });
        }
    
        private boolean isJwtValid(String jwt) {
            boolean returnValue = true;
            String subject = null;
            try {
                subject = Jwts.parser().setSigningKey(env.getProperty("token.secret"))
                    .parseClaimsJws(jwt).getBody()
                    .getSubject();
            } catch (Exception ex) {
                returnValue = false;
            }
            if (subject == null || subject.isEmpty()) {
                returnValue = false;
            }
            return returnValue;
        }
    
        //Mono, Flux 는 Spring WebFlux 에서 새로 나온 개념으로 반환되는 타입 개념으로 생각하면 된다(비동기 방식 반환)
        private Mono<Void> onError(ServerWebExchange exchange, String error, HttpStatus httpStatus) {
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(httpStatus);
    
            log.error(error);
            return response.setComplete();
        }
    
        public static class Config {
    
        }
    }
  • apply 메소드에서 토큰이 잘 발행이 되었는지를 판단하여 준다.
    • 만약 header에 Authrorization이 포함되어있지 않을 경우 onError 발생
    • 만약 Authrorization header에 Baarer를 제외한 값(토큰)이 실제 발행이 된 토큰인지 확인해서 발행이 된 토큰이면 성공
    • 발행된 토큰인지를 확인하기위해 isJwtValid 함수를 호출하게 되는데 이때, application.yml에 있는 token.secret값을 이용하여 복호화한다.

Application.yml

login, 회원가입을 제외한 요청에만 해당 필터를 타도록 한다.
암호화 할떄 사용했던 키를 그대로 넣는다

TEST

Bearer Token으로 발급받은 토큰을 전송하면 된다

실행도중 에러가 발생할 수 있는데 Pom에 해당 의존성을 추가하면 사라진다

728x90