[Spring] Swagger에 Header 넣기!

이원찬·2024년 2월 8일
1

Spring

목록 보기
9/13

참고 자료

Set JWT with Spring Boot and Swagger UI | Baeldung

현재 상황

사용중인 라이브러리

// swaggerDoc
implementation 'org.springdoc:springdoc-openapi-ui:1.6.15'

spring으로 jwt 토큰을 이용해 인가를 하던 상황에

헤더에 swagger에서 token을 넘겨주지 못하여 swagger로 테스트 하기에 불편한 상황이 있었다.

우리는 헤더에 accessToken, refreshToken를 받아야한다.

curl -X 'POST' \
  'http://localhost:8080/users/test' \
  -H 'accept: */*' \
  -H 'accessToken: ...' \
  -H 'refreshToken: ...' \
  -d ''

이런 형식이다.

Swagger에서는 헤더에 넣는 입력을 따로 명시해 주지 않는다.

헤더에 accessToken, refreshToken이 필요한데도 넣을수 없음…

직접 우리가 만들어서 헤더에 넣어주자

1. 필요한 SecuritySchemes 만들어주기

@Configuration 가 붙은 SwaggerConfig에서

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SwaggerConfig {
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .components(
                        new Components()
																// accessToken이라는 스키마 만들어주기
																.addSecuritySchemes("accessToken", new SecurityScheme()
                                        .name("accessToken")
                                        .type(SecurityScheme.Type.APIKEY)
                                        .in(SecurityScheme.In.HEADER)
                                        .bearerFormat("JWT")
                                )
																// refreshToken이라는 스키마 만들어주기
                                .addSecuritySchemes("refreshToken", new SecurityScheme()
                                        .name("refreshToken")
                                        .type(SecurityScheme.Type.APIKEY)
                                        .in(SecurityScheme.In.HEADER)
                                        .bearerFormat("JWT")
                                )
                );
    }
}

위와같이 입력해보자

그 다음 Swagger UI를 들어가보면

저기 오른쪽 아래에

초록 버튼이 보인다. 들어가보면

위처럼 headerapiKey를 입력받는 창이 나온다.

위처럼 적당히 입력해준다.

눈치 챌수도 있지만 /users/test api를 보면 오른쪽에 자물쇠가 걸려 있다.

자물쇠가 걸려있는 이유는 /users/testSecurityRequirement 를 걸어놨기 때문이다.

@Operation(summary = "테스트 유저 생성", description =
            "# Test User를 생성합니다. 다른 기능을 테스트 할때 이용 하세요"
            **, security = {@SecurityRequirement(name = "accessToken"), @SecurityRequirement(name = "refreshToken")}**
    )
    @PostMapping("/test")
    public ApiResponse<UserResponseDTO.JoinResultDTO> createTestUser() {
        return ApiResponse.onSuccess(
                SuccessStatus.User_OK.getCode(),
                SuccessStatus.User_OK.getMessage(),
                UserConverter.createTestUser(userService.createTestUser())
        );
    }

위 코드처럼 SecurityRequirement 입력한뒤 헤더로 넣고싶은 스키마들을 입력해준다.

만약 accessToken, refreshToken이 필요한 자동로그인에서는 위처럼 해주면 된다.

하나만 필요하다면 아래 처럼

@Operation(summary = "테스트 유저 생성", description =
            "# Test User를 생성합니다. 다른 기능을 테스트 할때 이용 하세요"
            **, security = @SecurityRequirement(name = "accessToken")
)**

호출을 해보면

헤더가 들어간 상태로 api가 호출되는 것을 볼 수 있다.

profile
소통과 기록이 무기(Weapon)인 개발자

2개의 댓글

comment-user-thumbnail
2024년 8월 13일

🙏

1개의 답글