#9 BE 세팅(api interceptor)

또여·2022년 11월 4일
0

사업아이템

목록 보기
10/11

https://congsong.tistory.com/24

위에서 작성한 그대로 했다.

필요성

api를 호출할때 토큰으로 권한을 가진 상태인지 아닌지 체크를 해야한다
보통 token을 rest api 헤더에 담아서 보냄

어쨋든 그래서 api 요청에 들어왔을때, controller에 가기전에 가로채서 검증을 먼저 한다. 그래서 이름이 interceptor 이다

구현

AuthInterceptor.java

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Slf4j
public class AuthInterceptor implements HandlerInterceptor {

... 중략

    @Override
    public void postHandle(
            HttpServletRequest request,
            HttpServletResponse response,
            Object handler,
            @Nullable ModelAndView modelAndView)
            throws Exception {
        System.out.println("[AuthInterceptor] postHandle");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public boolean preHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("[AuthInterceptor] preHandle");

        if (validateUri(request.getRequestURI())) {
            RSAKeyProvider keyProvider = new AwsCognitoRSAKeyProvider(region, userPoolId);
            Algorithm algorithm = Algorithm.RSA256(keyProvider);
            JWTVerifier jwtVerifier = JWT.require(algorithm).build();

            String token = request.getHeader(HttpHeaders.AUTHORIZATION);
            jwtVerifier.verify(token);
        }

        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    private boolean validateUri(String uri) {
        if (skipUrl.contains(uri)) return false;
        else return true;
    }
}

패키지 위치는 특별히 상관없고 나는 적당히 config 하위에 만들었다
중요한건 HandlerInterceptor 를 implements 해서 핸들러를 override 해서 사용한다는점.

preHandle 에서는 권한이 필요한 api의 경우 권한을 체크하는 로직이 추가되어야 한다

skipUrl로 요청이 온것이라면 권한체크를 하지 않도록 함

코그니토는 RSA256 방식을 사용한다고 해서 이렇게 처리함


WebMvcConfig.java


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Bean
    public AuthInterceptor authInterceptor() {
        return new AuthInterceptor(); // 1
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor());
    }
}

여기도 마찬가지로 config 하위에 두었다
어떤 interceptor를 쓰는지 지정하는 그런것이라고 보면 좋겠다.

💯 @Bean 해줘야 @Value 사용이 가능하므로 1번 주석처럼 사용해줘야한다


테스트

코그니토로 계정 생성한 후에 로그인을 하면 아래와 같이 JWT가 나온다

실제로 요청할때는 웹의 로컬스토리지에 담아서 헤더로 보내겠지만, 지금은 BE만 있으므로, 발급된 토큰을 헤더에 넣고 test 호출

헤더에 Authorization에 넣고 호출하여 토큰 유효성을 확인한다
에러메세지 없이 지나가면, 이후에 preHandler를 통과한 것이므로 비즈니스 로직을 처리하면 된다.
잘못된 토큰을 넣으면 당연히 에러 발생함

profile
기록 열심히하는 개발자인척

0개의 댓글