본문 바로가기
내가 배운 것들/문제 해결

[SpringBoot] Swagger v2를 Jwt 인증 환경에서 사용할 수 있도록 구성하기

by Zabee52 2021. 12. 11.

Swagger v2

이 글을 보는 사람은 Swagger가 뭔지는 아는데 어떻게 Jwt를 사용하는 환경에 어떻게 적용하는 것인지 궁금해서 들어오는 것이라고 생각한다.

그래서 거두절미하고 코드스니펫부터 제공하겠다.

 

코드를 보기 이전에 가장 먼저 확인해야 할 부분!

 

Swagger v2는 SpringBoot 최신버전에서 제대로 작동 안 할 수도 있기 때문에,

build.gradle에서 springboot 버전을 2.5.3 으로 맞춰줘야 한다.

 

plugins {
    id 'org.springframework.boot' version '2.5.3'
}

 

이제 진짜 코드다.

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                // 스웨거가 RestController를 전부 스캔을 한다.
                // basePackage => 어디를 범위로 스캔을 할 것인지 작성
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo())
                
                // 여기부터 jwt를 위한 설정
                .forCodeGeneration(true)
                .ignoredParameterTypes(java.sql.Date.class)
                .genericModelSubstitutes(ResponseEntity.class)
                .securityContexts(Lists.newArrayList(securityContext()))
                .securitySchemes(Lists.newArrayList(authorizationKey()))
                .useDefaultResponseMessages(false);
    }

    private ApiInfo apiInfo() {

        return new ApiInfoBuilder()
                .title("제목이에요")
                .description("설명이에요")
                .version("0.0.1")
                .termsOfServiceUrl("https://dazbee.tistory.com")
                .license("LICENSE")
                .licenseUrl("")
                .build();
    }

    /**
     * authorizationKey
     *
     * @return
     */
    private ApiKey authorizationKey() {
        return new ApiKey("JWT_TOKEN", "Authorization", "header");
    }

    /**
     * securityContext
     *
     * @return
     */
    private springfox.documentation.spi.service.contexts.SecurityContext securityContext() {

        return springfox.documentation.spi.service.contexts.SecurityContext.builder()
                .securityReferences(defaultAuth())
                .forPaths(PathSelectors.any())
                .build();
    }

    /**
     * defaultAuth
     *
     * @return
     */
    private List<SecurityReference> defaultAuth() {

        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;

        return Lists.newArrayList(new SecurityReference("JWT_TOKEN", authorizationScopes),
                new SecurityReference("HTTP_REQUEST", authorizationScopes));
    }
    // 완료가 되었으면 오른쪽 URL 로 접속 => http://localhost:8080/swagger-ui.html
    // Swagger 3.0.0 이상 버전을 사용할 경우/swagger-ui 로 접속
}

 

커스텀은 심플하다.

 

private ApiKey authorizationKey() {
    return new ApiKey("JWT_TOKEN", "Authorization", "header");
}

AuthorizationKey의 중앙(keyname)에 JWT 토큰을 교환할 때 쓰이는 헤더 이름을 적어주면 된다.

 

끝!

아 근데 이러려고 만든 블로그 아닌데.....

 

댓글