[Spring Boot] Swagger JWT 인증 사용하기

Posted by 김성철

Spring Boot - Swagger JWT 인증 사용하기

JWT 설정을 전부다 해놨다고 하면, 아래와 같이 swaagerconfig 파일만 수정하면 작동이 된다.  
apiKey 메소드에서 저장한 이름이랑, Springsecurity 에서 키값을 비교할때 헤더에서 꺼내오는 키값 이름이 다를경우 오류가 발생하니.  
꼭 확인하도록하자  

SwaggerConfig.java 파일 수정

기존에는 api() 메소드만 있었는데, 하단의 JWT 인증 사용하기 위한 메소드를 추가  
apiKey() 메소드에서는 사용할 키 방식, 키값의 이름, 키, 헤더에 포함됐다는 내용임  
  
=================================================================================================================  
import java.util.Arrays;  
import java.util.Collections;  
import java.util.List;  
  
@Configuration  
@EnableSwagger2  
public class SwaggerConfig {  
  
	private String oauth2ServerUrl;  
  
	@Bean  
	public Docket api(){  
		return new Docket(DocumentationType.SWAGGER_2)  
			.apiInfo(apiInfo())  
			.select()  
			.apis(RequestHandlerSelectors.any())  
			.paths(PathSelectors.any())  
			.build()  
			.securityContexts(Arrays.asList(securityContext()))  
			.securitySchemes(Arrays.asList(apiKey()));  
	}  
  
	private ApiInfo apiInfo() {  
		return new ApiInfo(  
				"Stock RestAPI",  
				"주식파싱",  
				"1.0",  
				"termsofserviceurl",  
				new Contact("kimsungchul", "http://github.com/kkimsungchul", "kimsc1218@gmail.com"),  
				"License of API",  
				"API license URL",  
				Collections.emptyList());  
	}  
  
	//스웨거에서 사용할 토큰값에 대한 정보 설정  
	// (키종류 , 키이름 , 헤더값이라는 표시)  
	//여기서 설정한 키이름으로, JwtTokenUtil 클래스에서 꺼내서 사용함  
	private ApiKey apiKey() {  
		return new ApiKey("JWT", "jwt", "header");  
	}  
  
	private SecurityContext securityContext() {  
		return SecurityContext.builder().securityReferences(defaultAuth()).build();  
	}  
  
	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));  
	}  
  
}  
  
=================================================================================================================  

오류

https://recordsoflife.tistory.com/606  
https://codeinlife.tistory.com/47  
https://stackoverflow.com/questions/49785592/bearer-token-in-postman  
https://velog.io/@cada/%ED%86%A0%EA%B7%BC-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D%EC%97%90%EC%84%9C-bearer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C  
  
인증을 하려고하는데 토큰값이 일치하지않다고 나옴.  
내가 참고 했던 사이트에서는 토큰값 앞에 "Bearer "  를 전송해서 보낸다고 하였음.  
난 안보내는데.. 그래서 이거에 대해 찾아본 내용은 위의 링크들에 있음  
  
if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) { 이부분에서  requestTokenHeader.startsWith("Bearer ") 이거를 제거했음