-
[Spring] Swagger에서 JWT관련 설정하기 (Authorization, ArgumentResolver)Backend/Spring 2023. 5. 27. 15:14728x90
Swagger 설정 관련 포스트
Swagger와 JWT
JWT를 사용하여 사용자 인증을 했었기 때문에, 거의 모든 api에서 토큰 검사를 하고 있었다. ArgumentResolver를 통해 들어온 token을 검사하고 token에서 사용자 Id를 가져와 사용자 인증 엔티티로 변환하여 사용하였다. 여기서 필요했던 Swagger 설정에 대해 설명하고자 한다.
Swagger Security 설정
거의 모든 api에서 토큰 검사를 진행했기에, 매 api 마다 token 값을 포함하여 api 요청을 보내는 것이 상당히 귀찮아서 다음 설정을 추가했다. Swagger UI상에서 Authorization을 한번 하게되면 로그아웃까지 인증이 필요했던 api를 인증없이 요청할 수 있다.
@Configuration public class SwaggerConfig { @Bean public OpenAPI api() { String jwtSchemeName = "Authorization"; SecurityRequirement securityRequirement = new SecurityRequirement().addList(jwtSchemeName); Components components = new Components() .addSecuritySchemes(jwtSchemeName, new SecurityScheme() .name(jwtSchemeName) .type(SecurityScheme.Type.HTTP) .scheme("bearer") .bearerFormat("JWT")); return new OpenAPI() .components(components) .info(apiInfo()) .addSecurityItem(securityRequirement); } private Info apiInfo() { return new Info() .title("API Doc") .description("api 문서화") .version("1.0.0"); } }
Swagger Request Parameter 설정
JWT 토큰 인증을 위해 HandlerMethodArgumentResolver를 구현하여 토큰을 인증하고 토큰의 Claim에 저장된 정보를 가져와 AuthMember라는 엔티티를 반환하도록 하였다. api 요청 시 파라미터 값에 대해서 구현한 argumentresolver를 통해 반환된 AuthMember엔티티는 @Auth 애노테이션을 통해 값이 저장되었다.
여기서 Swagger는 이 AuthMember를 RequestBody로 인식하여 실제 RequestBody로 정의한 변수와 잘 매칭이 안되는 문제가 발생했다. Swagger에 해당 파라미터를 제외시키는 코드를 추가해야 해서 다음을 작성했다.
springdoc에게 토큰인증을 위해 필요했던 Auth 애노테이션을 무시하도록 하는 코드로 컨트롤러 전역에서 사용하도록 선언했다.
static { SpringDocUtils.getConfig().addAnnotationsToIgnore(Auth.class); }
728x90'Backend > Spring' 카테고리의 다른 글