망 자체는 공용망을 사용하지만, 접근은 특정 인증키를 확인하여 접근을 가능토록 구현을 하고 싶었습니다.
구글에 일반적으로 Spring Security API Key 등을 검색하면 JWT 등과 로그인.. 비밀번호 와 같은 포스팅이 검색됩니다.
이 포스팅에서는 해당 내용이 아니니, 참고 바랍니다.
해당 포스팅은 https://stackoverflow.com/questions/48446708/securing-spring-boot-api-with-api-key-and-secret 해당 글을 인용하였으니 참고 바랍니다.
1. APIKeyAuthFilter.java 를 만들어줍니다.
필자 같은 경우는 이러한 경로에 만들었습니다.

2. 아래와 같이 시큐리티 필터 코드를 작성해줍니다.
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
import javax.servlet.http.HttpServletRequest;
public class APIKeyAuthFilter extends AbstractPreAuthenticatedProcessingFilter {
private String principalRequestHeader;
public APIKeyAuthFilter(String principalRequestHeader) {
this.principalRequestHeader = principalRequestHeader;
}
@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
return request.getHeader(principalRequestHeader);
}
@Override
protected Object getPreAuthenticatedCredentials(HttpServletRequest request) {
return "N/A";
}
}
3. 시큐리티 콘피그를 아래와 같이 설정합니다.
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;;
@RequiredArgsConstructor
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Value("${appname.http.auth-token-header.name}")
private String principalRequestHeader;
@Value("${appname.http.auth-token}")
private String principalRequestValue;
@Override
protected void configure(HttpSecurity http) throws Exception {
APIKeyAuthFilter filter = new APIKeyAuthFilter(principalRequestHeader);
filter.setAuthenticationManager(authentication -> {
String principal = (String) authentication.getPrincipal();
if (!principalRequestValue.equals(principal))
throw new BadCredentialsException("The API key was not found or not the expected value.");
authentication.setAuthenticated(true);
return authentication;
});
http
.cors().disable()
.csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilter(filter)
.authorizeRequests()
.anyRequest()
.authenticated()
.and().formLogin().disable();
}
}
위와 같이 작성해줍니다.
@Value 어노테이션의 "appname" 부분은 자신의 프로젝트 어플리케이션 이름을 써두면 좋을 것 같습니다.
4. 스프링 application 설정 파일에 들어갑니다. (application.yml or application.properties)
필자는 yml 파일로 작성하여 사용중이니 참고 바랍니다.

이곳에
appname:
http:
auth-token-header:
name: Authorization
auth-token: fdasrv34atdzbt4zeex7y
이러한 식으로 작성해줍니다.
auth-token-header.name 는 인증키 값이 포함될 헤더의 파라미터 이름을 지정해주고
auth-token 에 인증키 값을 지정합니다.
4. 이제 인증키가 유효하지 않을 경우 Whitelabel Error Page 를 표시하게 됩니다.
(스프링 시큐리티 콘피그의 BadCredentialsException 에 throw 된 것입니다)
ControllerAdvice 등을 이용하여 RESTAPI 성격에 맞게 json 으로 리턴을 해줄 수 있도록 작성해 주시면 되겠습니다.