본문 바로가기

IT/SpringBoot

스프링 부트 #4.10. 보안

반응형

 

4.10. 보안

스프링 보안이 클래스 경로에 있는 경우 웹 응용 프로그램은 기본적으로 보호됩니다. 스프링 부트은 스프링 시큐리티의 콘텐츠 협상 전략에 의존하여 사용 여부를 결정합니다. 웹 응용 프로그램에 메서드 수준 보안을 추가하려면 원하는 설정으로 추가할 수도 있습니다. 추가 정보는 스프링 보안 참조 가이드에서찾을 수 있습니다.httpBasicformLogin@EnableGlobalMethodSecurity

기본값에는 단일 사용자가 있습니다. 사용자 이름은 암호가 임의이며 다음 예제와 같이 응용 프로그램이 시작될 때 INFO 수준에서 인쇄됩니다.UserDetailsServiceuser

Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
  로깅 구성을 미세 조정하는 경우 범주가 -level 메시지로 설정되었는지 확인합니다. 그렇지 않으면 기본 암호가 인쇄되지 않습니다. org.springframework.boot.autoconfigure.securityINFO

및 를 제공하여 사용자 이름과 암호를 변경할 수 있습니다.spring.security.user.namespring.security.user.password

웹 응용 프로그램에서 기본적으로 얻을 수 있는 기본 기능은 다음과 같습니다.

  • 메모리 저장소와 생성된 암호가 있는 단일 사용자가 있는 Bean(또는 WebFlux 응용 프로그램의 경우)은 사용자의 속성에 대한 SecurityProperties.User 참조).UserDetailsServiceReactiveUserDetailsService
  • 전체 응용 프로그램에 대한 양식 기반 로그인 또는 HTTP 기본 보안(요청의 헤더에 따라 다름) 전체 응용 프로그램(액추에이터가 클래스경로에 있는 경우 액추에이터 끝점 포함).Accept
  • 인증 이벤트를 게시하기위한 A입니다.DefaultAuthenticationEventPublisher

콩을 추가하여 다른 것을 제공할 수 있습니다.AuthenticationEventPublisher

4.10.1. MVC 보안

기본 보안 구성은 에서 및 에서 구현됩니다. 웹 보안을 위해 가져오기 및 비웹 응용 프로그램에서도 관련된 인증을 구성합니다. 기본 웹 응용 프로그램 보안 구성을 완전히 끄거나 OAuth 2 클라이언트 및 리소스 서버와 같은 여러 스프링 보안 구성 요소를 결합하려면 빈 형식을 추가합니다(이렇게 하면 구성이나 액추에이터의 보안이 비활성화되지 않음).SecurityAutoConfigurationUserDetailsServiceAutoConfigurationSecurityAutoConfigurationSpringBootWebSecurityConfigurationUserDetailsServiceAutoConfigurationWebSecurityConfigurerAdapterUserDetailsService

구성을 끄려면 형식 또는 bean을 추가할 수 있습니다.UserDetailsServiceUserDetailsServiceAuthenticationProviderAuthenticationManager

사용자 지정을 추가하여 액세스 규칙을 재정의할 수 있습니다. Spring Boot는 액추에이터 끝점 및 정적 리소스에 대한 액세스 규칙을 재정의하는 데 사용할 수 있는 편리한 방법을 제공합니다. 속성을 기반으로 하는 것을 만드는 데 사용할 수 있습니다. 일반적으로 사용되는 위치에서 리소스를 만드는 데 사용할 수 있습니다.WebSecurityConfigurerAdapterEndpointRequestRequestMatchermanagement.endpoints.web.base-pathPathRequestRequestMatcher

4.10.2. 웹플럭스 보안

Spring MVC 응용 프로그램과 마찬가지로 종속성을 추가하여 WebFlux 응용 프로그램을 보호할 수 있습니다. 기본 보안 구성은 에서 및 에서 구현됩니다. 웹 보안을 위해 가져오기 및 비웹 응용 프로그램에서도 관련된 인증을 구성합니다. 기본 웹 응용 프로그램 보안 구성을 완전히 끄려면 형식의 빈을 추가할 수 있습니다(이렇게 하면 구성이나 액추에이터의 보안이 비활성화되지 않음).spring-boot-starter-securityReactiveSecurityAutoConfigurationUserDetailsServiceAutoConfigurationReactiveSecurityAutoConfigurationWebFluxSecurityConfigurationUserDetailsServiceAutoConfigurationWebFilterChainProxyUserDetailsService

구성을 끄려면 형식 또는 bean을 추가할 수 있습니다.UserDetailsServiceReactiveUserDetailsServiceReactiveAuthenticationManager

액세스 규칙 및 OAuth 2 클라이언트 및 리소스 서버와 같은 여러 스프링 보안 구성 요소의 사용은 사용자 지정 빈을 추가하여 구성할 수 있습니다. Spring Boot는 액추에이터 끝점 및 정적 리소스에 대한 액세스 규칙을 재정의하는 데 사용할 수 있는 편리한 방법을 제공합니다. 속성을 기반으로 하는 것을 만드는 데 사용할 수 있습니다.SecurityWebFilterChainEndpointRequestServerWebExchangeMatchermanagement.endpoints.web.base-path

PathRequest 일반적으로 사용되는 위치에서 리소스를 만드는 데 사용할 수 있습니다.ServerWebExchangeMatcher

예를 들어 다음과 같은 것을 추가하여 보안 구성을 사용자 지정할 수 있습니다.

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    return http
        .authorizeExchange()
            .matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
            .pathMatchers("/foo", "/bar")
                .authenticated().and()
            .formLogin().and()
        .build();
}

4.10.3. OAuth2

OAuth2는 스프링에서 지원하는 널리 사용되는 권한 부여 프레임워크입니다.

클라이언트

클래스경로에 있는 경우 일부 자동 구성을 활용하여 OAuth2/Open ID 연결 클라이언트를 쉽게 설정할 수 있습니다. 이 구성은 아래의 속성을 사용합니다. 동일한 속성은 서슬렛 및 반응응용 프로그램 모두에 적용됩니다.spring-security-oauth2-clientOAuth2ClientProperties

다음 예제와 같이 접두사 아래에 여러 OAuth2 클라이언트 및 공급자를 등록할 수 있습니다.spring.security.oauth2.client

spring.security.oauth2.client.registration.my-client-1.client-id=abcd
spring.security.oauth2.client.registration.my-client-1.client-secret=password
spring.security.oauth2.client.registration.my-client-1.client-name=Client for user scope
spring.security.oauth2.client.registration.my-client-1.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-1.scope=user
spring.security.oauth2.client.registration.my-client-1.redirect-uri=https://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-1.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-1.authorization-grant-type=authorization_code

spring.security.oauth2.client.registration.my-client-2.client-id=abcd
spring.security.oauth2.client.registration.my-client-2.client-secret=password
spring.security.oauth2.client.registration.my-client-2.client-name=Client for email scope
spring.security.oauth2.client.registration.my-client-2.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-2.scope=email
spring.security.oauth2.client.registration.my-client-2.redirect-uri=https://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-2.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-2.authorization-grant-type=authorization_code

spring.security.oauth2.client.provider.my-oauth-provider.authorization-uri=https://my-auth-server/oauth/authorize
spring.security.oauth2.client.provider.my-oauth-provider.token-uri=https://my-auth-server/oauth/token
spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=https://my-auth-server/userinfo
spring.security.oauth2.client.provider.my-oauth-provider.user-info-authentication-method=header
spring.security.oauth2.client.provider.my-oauth-provider.jwk-set-uri=https://my-auth-server/token_keys
spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name

OpenID Connect 검색을지원하는 OpenID Connect 공급자의 경우 구성을 더욱 단순화할 수 있습니다. 공급자는 발급자 식별자로 주장하는 URI로 구성해야 합니다. 예를 들어 제공된 "https://example.com"인 경우 "https://example.com/.well-known/openid-configuration"로 만들어집니다. 결과는 . 다음 예제에서는 OpenID 연결 공급자를 다음과 함께 구성할 수 있는 방법을 보여 줄 수 있습니다.issuer-uriissuer-uriOpenID Provider Configuration RequestOpenID Provider Configuration Responseissuer-uri

spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/

기본적으로 스프링 시큐리티의 유일한 URL 일치프로세스. 다른 패턴을 사용하도록 사용자 지정하려면 해당 사용자 지정 패턴을 처리하기 위해 구성을 제공해야 합니다. 예를 들어 서슬렛 응용 프로그램의 경우 다음과 유사한 사용자 고유를 추가할 수 있습니다.OAuth2LoginAuthenticationFilter/login/oauth2/code/*redirect-uriWebSecurityConfigurerAdapter

public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .oauth2Login()
                .redirectionEndpoint()
                    .baseUri("/custom-callback");
    }
}
공통 공급자를 위한 OAuth2 클라이언트 등록

Google, Github, Facebook 및 Okta를 포함한 일반적인 OAuth2 및 OpenID 제공업체의 경우 공급자 기본값(각각) 집합을 제공합니다.googlegithubfacebookokta

이러한 공급자를 사용자 지정할 필요가 없는 경우 기본값을 추론해야 하는 특성으로 속성을 설정할 수 있습니다. 또한 클라이언트 등록의 키가 기본 지원 공급자와 일치하는 경우 Spring Boot도 유추합니다.provider

즉, 다음 예제의 두 구성은 Google 공급자를 사용합니다.

spring.security.oauth2.client.registration.my-client.client-id=abcd
spring.security.oauth2.client.registration.my-client.client-secret=password
spring.security.oauth2.client.registration.my-client.provider=google

spring.security.oauth2.client.registration.google.client-id=abcd
spring.security.oauth2.client.registration.google.client-secret=password
리소스 서버

클래스 경로에 있는 경우 스프링 부트은 OAuth2 리소스 서버를 설정할 수 있습니다. JWT 구성의 경우 다음과 같은 예제와 같이 JWK Set URI 또는 OIDC 발급자 URI를 지정해야 합니다.spring-security-oauth2-resource-server

spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/oauth2/default/v1/keys
spring.security.oauth2.resourceserver.jwt.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
  권한 부여 서버가 JWK Set URI를 지원하지 않는 경우 JWT의 서명을 확인하는 데 사용되는 공용 키로 리소스 서버를 구성할 수 있습니다. 이 작업은 PEM 인코딩된 x509 형식의 공용 키가 포함된 파일을 가리키야 하는 속성을 사용하여 수행할 수 있습니다. spring.security.oauth2.resourceserver.jwt.public-key-location

동일한 속성은 서슬렛 및 반응형 응용 프로그램 모두에 적용됩니다.

또는 서슬레 응용 프로그램 또는 반응형 응용 프로그램에 대한 자신의 콩을 정의할 수 있습니다.JwtDecoderReactiveJwtDecoder

JWT 대신 불투명 토큰을 사용하는 경우 다음 속성을 구성하여 성찰을 통해 토큰의 유효성을 검사할 수 있습니다.

spring.security.oauth2.resourceserver.opaquetoken.introspection-uri=https://example.com/check-token
spring.security.oauth2.resourceserver.opaquetoken.client-id=my-client-id
spring.security.oauth2.resourceserver.opaquetoken.client-secret=my-client-secret

다시 말하지만, 동일한 속성은 서슬렛 및 반응 응용 프로그램 모두에 적용됩니다.

또는 서슬레 응용 프로그램 또는 반응형 응용 프로그램에 대한 자신의 콩을 정의할 수 있습니다.OpaqueTokenIntrospectorReactiveOpaqueTokenIntrospector

권한 부여 서버

현재 스프링 시큐리티는 OAuth 2.0 권한 부여 서버 구현을 지원하지 않습니다. 그러나 이 기능은 스프링 시큐리티 OAuth 프로젝트에서 사용할 수 있으며, 결국 스프링 시큐리티가 완전히 대체됩니다. 그때까지 모듈을 사용하여 OAuth 2.0 권한 부여 서버를 쉽게 설정할 수 있습니다. 지침은 설명서를 참조하십시오.spring-security-oauth2-autoconfigure

4.10.4. SAML 2.0

당사자

클래스 경로에 있는 경우 일부 자동 구성을 활용하여 SAML 2.0 리셀링 파티를 쉽게 설정할 수 있습니다. 이 구성은 아래의 속성을 사용합니다.spring-security-saml2-service-providerSaml2RelyingPartyProperties

의존하는 파티 등록은 ID 공급자, IDP 및 서비스 공급자 인 SP 간의 쌍이 있는 구성을 나타냅니다. 다음 예제와 같이 접두사 아래에 여러 개의 의존하는 당사자를 등록할 수 있습니다.spring.security.saml2.relyingparty

spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.verification.credentials[0].certificate-location=path-to-verification-cert
spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.entity-id=remote-idp-entity-id1
spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.sso-url=https://remoteidp1.sso.url

spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.verification.credentials[0].certificate-location=path-to-other-verification-cert
spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.entity-id=remote-idp-entity-id2
spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.sso-url=https://remoteidp2.sso.url

4.10.5. 액추에이터 보안

보안을 위해 기본적으로 비활성화된 모든 액추에이터 이외의 모든 액추에이터가 비활성화됩니다. 이 속성은 액추에이터를 활성화하는 데 사용할 수 있습니다./health/infomanagement.endpoints.web.exposure.include

스프링 시큐리티가 클래스경로에 있고 다른 WebSecurityConfigurerAdapter가 없는 경우 스프링 부트 자동 구성 이외의 모든 액추에이터가 보호됩니다. 사용자 지정을 정의하는 경우 스프링 부트 자동 구성이 다시 해제되고 액추에이터 액세스 규칙을 완전히 제어할 수 있습니다./health/infoWebSecurityConfigurerAdapter

  설정하기 전에 노출된 액추에이터가 중요한 정보를 포함하지 않거나 방화벽 뒤에 또는 스프링 시큐리티와 같은 것으로 고정되도록 합니다. management.endpoints.web.exposure.include
교차 사이트 요청 위조 보호

스프링 부트은 스프링 시큐리티의 기본값에 의존하므로 CSRF 보호는 기본적으로 켜져 있습니다. 즉, 기본 보안 구성이 사용 중일 때 (종료 및 로거 끝점)이 필요한 액추에이터 끝점(종료 및 로거 엔드포인트)이 필요하거나 403개의 금지된 오류가 발생합니다.POSTPUTDELETE

  비브라우저 클라이언트에서 사용하는 서비스를 만드는 경우에만 CSRF 보호를 완전히 사용하지 않도록 설정하는 것이 좋습니다.

CSRF 보호에 대한 추가 정보는 스프링 보안 참조 가이드에서찾을 수 있습니다.

 

Spring Boot Reference Documentation

Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, Christian Dupuis, Sébastien Deleuze, Michael Simons, Vedran Pavić, Jay Bryant, Madhura Bhave, Eddú Meléndez, Scott Frederick

2.3.1.RELEASE

Copyright © 2012-2020

Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.

출처 : https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/htmlsingle/#boot-features-security

반응형