Kua
Kua's Miscellaneous
Kua
  • 분류 전체보기 (179)
    • 대문 (2)
    • Tips (24)
      • Chrome (2)
      • Windows (3)
      • IDE (3)
      • 기타 (16)
    • CodingTest (44)
    • Language (19)
      • PHP (5)
      • C# (7)
      • Java (1)
      • Kotlin (6)
    • Framework & Runtime (14)
      • SpringBoot (10)
      • Node.js (2)
      • Vue.js (1)
      • Gradle (1)
    • DevOps (12)
      • Linux (1)
      • Docker (4)
      • Kubernetes (2)
      • Apache Kafka (1)
      • AWS (0)
    • 일상다반사 (53)
      • 도서 (1)
      • 개발 (8)
      • 후기 - IT (7)
      • 후기 - 일상 (13)
      • 차가리 (4)
      • 방송통신대학교 (4)
      • 음식 (2)
    • Games (11)
      • Minecraft (7)
      • VR (2)
      • 그외 (2)

다른 링크

  • Github

최근 글

  • [DGS] GraphQLSchema: Factory met⋯
    2023.05.01
    [DGS] GraphQLSchema: Factory met⋯
  • Apple과 Samsung을 내 기준에서 정리해보았다.
    2023.02.07
    Apple과 Samsung을 내 기준에서 정리해보았다.
  • Adguard 제품을 2년간 사용한 후기 그리고 NordV⋯
    2023.01.30
    Adguard 제품을 2년간 사용한 후기 그리고 NordV⋯
  • 알리발 카링킷 프로(Carlinkit Pro) 구매 후기 ⋯
    2022.12.06
    알리발 카링킷 프로(Carlinkit Pro) 구매 후기 ⋯
  • 출고 한달도 안되서 중고차값을 보면? (첫차는 똥쓰레기 앱⋯
    2022.12.02

인기 글

  • C# NET 을 위한 Modbus Library 에 대한 ⋯
    2021.08.05
    C# NET 을 위한 Modbus Library 에 대한 ⋯
  • 훈련소 준비물과 솔직후기 (39사단/충무신병교육대대) 20⋯
    2021.05.15
    훈련소 준비물과 솔직후기 (39사단/충무신병교육대대) 20⋯
  • Spring Boot REST API Spring Secu⋯
    2021.07.06
    Spring Boot REST API Spring Secu⋯
  • yyyy-mm-ddTHH:mm:ss(LocalDateTim⋯
    2021.09.28
  • 교육 행사 사이트 모음(세미나,웨비나,강연,공모전,해커톤)
    2021.07.15
반응형

최근 댓글

  • 이제... 졸업 요건이 사라졌습니다.
    무명
  • 많은 도움이 되었습니다.
    TESTER
  • 몇 년 전에 마인크래프트 서버 개발자로 계시던걸 본 것 같⋯
    ㅇㅇ
  • 안녕하세요, 확인 결과 Github에서는 말씀 주신 ⋯
    Kua
  • https://github.com/NModbus/NModb⋯
    우상혁

태그

  • java
  • bronze2
  • c#
  • github
  • Level1
  • bronze1
  • 갤럭시
  • 백준
  • function
  • Algorithm
  • error
  • Silver5
  • 알고리즘
  • codingtest
  • 코딩테스트
  • Plugin
  • Kotlin
  • 후기
  • minecraft
  • 마인크래프트
전체 방문자
66,870
오늘
9
어제
60
hELLO · Designed By 정상우.
Kua

Kua's Miscellaneous

Spring Boot REST API Spring Security 고유키 만들어서 접근 제한하기(api key and secret)
Framework & Runtime/SpringBoot

Spring Boot REST API Spring Security 고유키 만들어서 접근 제한하기(api key and secret)

2021. 7. 6. 10:11

망 자체는 공용망을 사용하지만, 접근은 특정 인증키를 확인하여 접근을 가능토록 구현을 하고 싶었습니다.

 

구글에 일반적으로 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 으로 리턴을 해줄 수 있도록 작성해 주시면 되겠습니다.

반응형
저작자표시 비영리
    'Framework & Runtime/SpringBoot' 카테고리의 다른 글
    • RestTemplate 와 ObjectMapper 활용기(스프링에서 다른 서버의 JSON API Token 을 가져와서 이용해야 할 때)
    • Kotlin Spring Boot 에 Querydsl 종속성이 추가된 프로젝트 소스 공유
    • [Querydsl] 하나의 응답을 원할 때, exist 사용을 자제하자.
    • [Querydsl] 동적 쿼리를 BooleanExpression 으로 작성하기
    API Key, API Token, Auth Token, Authorization, REST API, Spring Boot, spring security
    Kua
    Kua
    정보 공유, 개인 정리 공간 입니다.
    댓글쓰기
    다음 글
    Kotlin Spring Boot 에 Querydsl 종속성이 추가된 프로젝트 소스 공유
    이전 글
    [Querydsl] 하나의 응답을 원할 때, exist 사용을 자제하자.

    티스토리툴바