Spring Boot + Spring Security + Swagger
Spring Boot와 Spring Security를 이용한 api server에서, JWT token 인증 필터를 적용하고 Swagger를 이용하려하면 token 검증 로직에 걸려 403 Forbidden 권한 에러로 정상적인 작동을 하지 않는다.
Swagger로 테스트를 하면서 정상적인 api response를 받으려면, Swagger에서 요청을 보낼때 token 관련 설정을 추가해줘야한다.
따라서, Swagger Config를 수정해서 swagger에서 각 api 요청을 보낼때 token을 추가해서 보낼 수 있게 한다!
(spring security와 swagger는 적용되어있다고 가정)
Spring Boot에서 Swagger UI와 JWT 토큰을 설정하는 방법은 크게 두 부분으로 나눌 수 있다.
첫 번째는 OpenAPI 설정을 통해 Swagger에서 사용할 토큰 정보를 추가하는 것이고,
두 번째는 Swagger UI에서 사용자가 토큰 정보를 설정할 수 있도록 하는 것이다.
아래 코드의 각 주석으로, 어떤 내용인지 간단하게 적어두었다.
@Configuration
public class OpenApiConfig {
private static final String accessHeader = "Access-Token"; // Access 토큰
private static final String refreshHeader = "Refresh-Token"; // Refresh 토큰
@Bean
public OpenAPI openAPI() {
OpenAPI openAPI = new OpenAPI(); // OpenAPI 객체 생성
// API 정보 설정
openAPI.info(new Info()
.title("DEMO API")
.version("1.0")
.description("DEMO API Documentation"));
// 1번) 보안 요구사항 추가: Access 토큰, Refresh 토큰
openAPI.addSecurityItem(new SecurityRequirement().addList(accessHeader));
openAPI.addSecurityItem(new SecurityRequirement().addList(refreshHeader));
// 2번) 보안 스키마 설정 (JWT 토큰 형식)
openAPI.components(
new Components()
.addSecuritySchemes(
accessHeader,
new SecurityScheme()
.name(accessHeader) // Access 토큰 보안 스키마 이름 설정
.type(SecurityScheme.Type.HTTP) // 보안 스키마 타입 설정 (HTTP)
.scheme("bearer") // 스키마를 bearer로 설정
.in(SecurityScheme.In.HEADER) // 헤더에 토큰 포함
.bearerFormat("JWT") // JWT 형식으로 설정
)
.addSecuritySchemes( // Refresh 토큰 보안 스키마
refreshHeader,
new SecurityScheme()
.name(refreshHeader)
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.in(SecurityScheme.In.HEADER)
.bearerFormat("JWT")
)
);
return openAPI; // 설정된 OpenAPI 객체 반환
}
}
위와 같이 코드를 변경하고 server를 실행시키면 아래 사진과 같이 자물쇠가 달린 버튼들이 생긴다.
이제 Authorize 초록색 버튼을 눌러 열린 창에 token을 입력 후 Authorize 버튼을 누르고, api request를 보내면 header가 추가된 것을 볼 수 있다!
(혹시라도 잘못된 내용이 있다면 언제든지 댓글 달아주세요. 다들 화이팅 :-D )