[Swagger] Interceptor에서 Swagger 관련 Exclude 하기

GilLog·2021년 7월 21일
0

Spring

목록 보기
15/22

🙆‍♂️ import 🙇‍♂️

[Spring]Spring MVC Interceptor[LKS님의 블로그]


본인의 경우 API Server로 들어오는 모든 요청에서 JWT 검증을 수행하는 Interceptor를 만들어 사용하고 있었다.

public class JwtInterceptor extends HandlerInterceptorAdapter {
	private static final Logger LOG = Logger.getLogger(JwtInterceptor.class);
	@Autowired
	private AuthService authService;

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws IOException, JwtException {
		String jwt = request.getHeader("Authorization");
		if (jwt == null) {
			throw new AuthenticationException("JWT is null");
		}
		try {
			authService.vertifyJwt(jwt);
		} catch (JwtException e) {
			LOG.error("[JwtInterceptor] JwtException Throw");
			throw e;
		}
		return true;
	}
}

이때 해당 서버에서 API 문서 관리용으로 Swagger를 사용 중이었는데,

해당 검증 과정이 Swagger 페이지를 요청할때도 수행되고 있었다.

이를 위해 아래처럼 Interceptor에서 HttpServletRequest의 url를 검증하여 Interceptor에서 제외할 수도 있지만,

public class JwtInterceptor extends HandlerInterceptorAdapter {
	private static final Logger LOG = Logger.getLogger(JwtInterceptor.class);
	@Autowired
	private AuthService authService;

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws IOException, JwtException {
		String url = request.getRequestURI();
		if (url.contains("swagger") || url.contains("api-docs") || url.contains("webjars")) {
			return true;
		}
		String jwt = request.getHeader("Authorization");
		if (jwt == null) {
			throw new AuthenticationException("JWT is null");
		}
		try {
			authService.vertifyJwt(jwt);
		} catch (JwtException e) {
			LOG.error("[JwtInterceptor] JwtException Throw");
			throw e;
		}
		return true;
	}
}

Distpatcher ServletContext(servlet-context.xml)안에서 아래와 같이 아예 Interceptor의 대상 경로에서 제외할 수도 있다.

	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**" />
			<bean id="loggerInterceptor" class="project.config.logger.LoggerInterceptor"/>
		</mvc:interceptor>
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<mvc:exclude-mapping path="/v2/api-docs"/>
			<mvc:exclude-mapping path="/swagger-resources/**"/>
			<mvc:exclude-mapping path="/swagger-ui.html"/>
			<mvc:exclude-mapping path="/webjars/**"/>
			<bean id="jwtInterceptor" class="project.config.interceptor.JwtInterceptor"/>
		</mvc:interceptor>
	</mvc:interceptors>

결론

어떤 방식이 되었던 /v2/api-docs, swagger-ui, swagger-resources, webjars 가 포함된 경로들은,

Swagger에서 사용하고 있는 경로들이라 검증을 수행하는 Interceptor라면 제외시켜주면 정상적으로 Swagger가 동작한다.

profile
🚀 기록보단 길록을 20.10 ~ 22.02 ⭐ Move To : https://gil-log.github.io/

0개의 댓글