Spring Boot 3에 security 설정과 Swagger3 적용하기

LSH·2024년 1월 26일
0

설정

목록 보기
1/2

기존에 했던 프로젝트는 spring 2.7을 사용하였다. 프로젝트를 마친 후, 개인 프로젝트를 진행하려고 보니까 2버전대는 사라지고 3버전부터 프로젝트를 만들 수 있어서, 이와 관련하여 2버전에서 3버전으로 올라가면서 바뀌는 부분,spring security,swagger 설정하는데 있어서 바뀐부분을 얘기하고자 한다.

먼저 spring boot 프로젝트를 사용할 때는 JDK 1.8을 사용할 수 있었다.
그러나, 3버전으로 올라오면서 JDK 17 과 21 둘 중 하나만 선택해서 사용할 수 있게 되었다.

javax 패키지의 변경

  • Spring Boot 새 버전 부터는 jakarta를 사용해야 한다.(javax -> jakarta)

더 자세한 설명을 원한다면 아래 글을 보면 됩니다.

https://www.samsungsds.com/kr/insights/java_jakarta.html

Spring Security의 변경

  • 기존에 사용하던 세팅을 아래와 같이 수정했다.
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // Swagger 관련 URI 패턴
        String[] SWAGGER_URI = {
                "/v3/api-docs/**",
                "/swagger-ui/**",
                "/swagger-ui.index.html",
                "/webjars/**",
                "/swagger-resources/**"
        };

        // http 시큐리티 빌더
        http
                .csrf((csrf) -> csrf
                        .ignoringRequestMatchers("/api/**", "/api/token/**")
                ) // csrf를 비활성화할 경로 설정
                .httpBasic(withDefaults()) // 기본 http 인증 사용하지 않음
                // 세션을 사용하지 않는 상태로 설정
                .sessionManagement((session) -> session
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                )
                // 특정 경로에 대한 접근 허용 (인증되지 않은 사용자도 접근 가능)
                .authorizeHttpRequests((authorize) -> authorize
                        .requestMatchers(SWAGGER_URI).permitAll()
                        .requestMatchers(
                                "/",
                                "/api/unauth/**",
                                "/api/token/**",
                                "/error",
                                "/swagger-ui/**",
                                "/v3/api-docs/**"
                        ).permitAll()
                        // 그 외 모든 요청은 인증 필요
                        .anyRequest().authenticated()
                );
        http
                // 인증되지 않은 요청에 대한 처리 (401 Unauthorized 응답)
                .exceptionHandling(exceptionHandling ->
                        exceptionHandling.authenticationEntryPoint(
                                new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)
                        )
                );

        return http.build();
    }

Swagger 2 -> Swagger 3

  • 기존 spring boot 2버전대는 swagger 2를 사용하였다. 하지만 spring boot 버전이 3으로 올라오면서 swagger 또한 3으로 버전을 업그레이드 해서 사용해야 한다.

기존버전(swagger 2)

@Configuration
@EnableSwagger2
@RequiredArgsConstructor
public class SwaggerConfiguration {

    private final TypeResolver typeResolver;

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
//                .apiInfo(apiInfo())
                .alternateTypeRules(AlternateTypeRules.newRule(typeResolver.resolve(Pageable.class), typeResolver.resolve(Page.class)))
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.latteis.eumcoding"))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo())
                .securityContexts(Arrays.asList(securityContext()))
                .securitySchemes(Arrays.asList(apiKey()));
    }


    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("이음코딩")
                .description("블럭과 블럭을 잇고 강사와 어쩌구 저쩌구....")
                .version("1.0.0")
                .build();
    }

    private ApiKey apiKey() {
        return new ApiKey("JWT", "Authorization", "header");
    }

    private SecurityContext securityContext() {
        return SecurityContext.builder()
                .securityReferences(defaultAuth())
                .build();
    }


    // Swagger 기본 인증 설정
    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        return Arrays.asList(new SecurityReference("JWT", authorizationScopes));
    }

swagger 3 설정

@Configuration
@OpenAPIDefinition(
        info = @Info(
                title = "lsh API",
                version = "1.0.0",
                description = "개인 프로젝트"
        ),
        servers = @Server(url = "/")
)

@RequiredArgsConstructor
public class SwaggerConfiguration {


    @Bean
    public GroupedOpenApi publicApi() {
        return GroupedOpenApi.builder()
                .group("lsh")
                .packagesToScan("com.chat.project.controller")
                .pathsToMatch("/public/**")
                .build();
    }
        @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                // JWT 보안 요구 사항을 추가합니다. 이는 인증이 필요한 API에 적용됩니다.
                .addSecurityItem(new SecurityRequirement().addList("JWT", new ArrayList<>()))
                .components(new io.swagger.v3.oas.models.Components()
                        .addSecuritySchemes("JWT", new SecurityScheme()
                                .type(SecurityScheme.Type.HTTP)
                                .scheme("bearer")
                                .bearerFormat("JWT")));
    }
    

build.gradle

	implementation group: 'io.swagger.core.v3', name: 'swagger-annotations', version: '2.2.20'
	// SpringDoc OpenAPI UI 스타터 의존성 추가

	implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'
	implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

OpenApi를 사용함으로써 다른 블로그들에서는 swagger 3임에도 불구하고 Docket를 사용하는데 그렇게 사용하려면 OpenApi가아닌 springfox을 사용해야한다.

Swagger-UI를 제공하는 라이브러리의 업데이트 현황

[Spring Fox]
2020년 7월 3.0.0 버전을 마지막으로 업데이트 되고 있지 않음

[Spring Doc]
2023년 4월 1.7.0 버전 업데이트

이러한 상황이라 Spring Fox사용보다는 Spring Doc를 사용하는것을 추천한다.

참고

profile
메모하자.

0개의 댓글