기존에 했던 프로젝트는 spring 2.7을 사용하였다. 프로젝트를 마친 후, 개인 프로젝트를 진행하려고 보니까 2버전대는 사라지고 3버전부터 프로젝트를 만들 수 있어서, 이와 관련하여 2버전에서 3버전으로 올라가면서 바뀌는 부분,spring security,swagger 설정하는데 있어서 바뀐부분을 얘기하고자 한다.
먼저 spring boot 프로젝트를 사용할 때는 JDK 1.8을 사용할 수 있었다.
그러나, 3버전으로 올라오면서 JDK 17 과 21 둘 중 하나만 선택해서 사용할 수 있게 되었다.
https://www.samsungsds.com/kr/insights/java_jakarta.html
@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)
@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를 사용하는것을 추천한다.