java/spring

[Spring] Spring Security + Swagger 3.0 적용

danuri 2022. 7. 22. 13:43

Swagger는 REST API의 문서화, 테스트를 용이하게 해주는 프레임워크이다.

Spring에 Swagger를 적용하는 과정은 이전 글에서 다루었다.

2022.07.16 - [java/spring] - [Spring] Swagger 3.0 적용

 

[Spring] Swagger 3.0 적용

Swagger는 REST API의 문서화, 테스트를 용이하게 해주는 프레임워크이다. 나같은 경우는 백엔드 개발을 하면서 API들을 직접 문서화시켜서 다른 개발자들과 공유하곤 했는데, Swagger를 사용하면 개발

gksdudrb922.tistory.com

 

이번에는 Spring Security가 적용되어 있는 프로젝트에서 Swagger를 어떻게 적용시킬 수 있는지 알아보자.

 

SwaggerConfig

이전에 만들었던 SwaggerConfig 파일에서 다음 코드를 추가하자.

@Configuration
public class SwaggerConfig {

    @Bean
    public Docket api(TypeResolver typeResolver) {
        return new Docket(DocumentationType.OAS_30)
                .securityContexts(Arrays.asList(securityContext())) // 추가
                .securitySchemes(Arrays.asList(apiKey())) // 추가
                .additionalModels(typeResolver.resolve(MemberResponseDto.class))
                .additionalModels(typeResolver.resolve(ErrorResponse.class))
                .useDefaultResponseMessages(false)
                .select()
                .apis(RequestHandlerSelectors.basePackage(SwaggerInfo.basePackage))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo());
    }

    // 추가
    private SecurityContext securityContext() {
        return SecurityContext.builder()
                .securityReferences(defaultAuth())
                .build();
    }
    
    // 추가
    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        return Arrays.asList(new SecurityReference("Authorization", authorizationScopes));
    }

    // 추가
    private ApiKey apiKey() {
        return new ApiKey("Authorization", "Authorization", "header");
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Backend API")
                .description("Backend API 문서")
                .version("1.0")
                .build();
    }

}

 

추가한 부분 중 securityContext()는 인증 방식을, apiKey()는 Swagger 내에서 인증하는 방식을 나타낸 것이다. 여기서는 Authorization 헤더를 지정했다.

 

SecurityConfig

Spring Securiy 설정에 다음 코드를 추가한다.

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    ...

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                ...
                
                .antMatchers("/v3/api-docs/**", "/swagger-ui/**", "/swagger-resources/**").permitAll()
                
                ...

        return http.build();
    }
    
    ...
    
}

 

 

이제 서버를 켜고 swagger ui를 접속한다.

 

 

 

우측에 Authorize 버튼이 생긴 것을 볼 수 있다. 클릭해보자.

 

 

 

인증키를 입력할 수 있는 창이 나오는데, 여기에 본인 프로젝트에 맞게 인증키를 입력하면 된다. 나는 JWT 토큰을 사용하기 때문에, "Bearer {access token}" 을 입력해주었다.

 

알맞게 입력했다면 API에 접근해서 테스트 해볼 수 있다.

 


 

참고자료

https://lemontia.tistory.com/1027