IT/Framework

Spring boot 2.3.12 - Open Api 3.0 (Swagger 3.0) 시큐리티 분리 적용

Normal_One 2021. 7. 5. 21:01

 새롭게 옮긴 회사에서 API 설계를 할 시간이 없어서 API 설계 명세 없이 일단 개발을 진행하면서 Swagger로 API 명세 보여주는 것과 테스트를 진행하기로 했습니다. API 통신에 대한 유효성 검증을 위해 Jwt token을 사용하게 되었는데 Jwt token이 필요한 API들과 필요없는 API를 구분하여 보여주고 싶었습니다. 현재 국내 블로그에서는 내용이 정확하게 나와 있는 곳이 없어서 아래와 같이 작성하여 보여드립니다. 

 아래 소스를 보시면 spring.profiles.active를 변수로 전달하고 있는데 이 변수를 통해서 Open api의 설명에 여기 서버는 어디이고 현재 접속한 곳은 어떤 버전이다를 명기하고 싶었는데 Swagger 오류인지 처음에는 서버에 설명이 제대로 뜨지만 통신이 안되고 새로고침을 하면 서버가 초기화 되더군요. 나중 Swagger 버전에서는 수정되었으면 좋겠네요. 날이 많이 무덥고 동남아가 된 느낌이 드는 7월 입니다. 다들 코로나 조심하세요!

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.be.config;
 
import org.springdoc.core.GroupedOpenApi;
import org.springdoc.core.customizers.OpenApiCustomiser;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
 
@Configuration
@OpenAPIDefinition(info = @Info(title = "Backend", version = "v1"))
public class SwaggerConfig {
    
    @Bean
    public GroupedOpenApi SecurityGroupOpenApi(@Value("${spring.profiles.active}"String active) {
        return GroupedOpenApi
                .builder()
                .group("Security Open Api")
                .pathsToExclude("/auth/*""/")
                .addOpenApiCustomiser(buildSecurityOpenApi(active))
                .build();
    }
    
    @Bean
    public GroupedOpenApi NonSecurityGroupOpenApi(@Value("${spring.profiles.active}"String active) {
        return GroupedOpenApi
                .builder()
                .group("Non Security Open Api")
                .pathsToMatch("/auth/*")
                .build();
    }
    
    public OpenApiCustomiser buildSecurityOpenApi(String active) {
        SecurityScheme securityScheme = new SecurityScheme()
                .name("Authorization")
                .type(SecurityScheme.Type.HTTP)
                .in(SecurityScheme.In.HEADER)
                .bearerFormat("JWT")
                .scheme("bearer");
        
        return OpenApi -> OpenApi
                .addSecurityItem(new SecurityRequirement().addList("jwt token"))
                .getComponents().addSecuritySchemes("jwt token", securityScheme);
    }
    
}
cs