스프링 시큐리티 OAuth 2.0을 활용한 인증 및 권한 부여

스프링 시큐리티 OAuth 2.0 소개

스프링 시큐리티는 스프링 프레임워크에서 제공하는 보안 프레임워크이다. 스프링 시큐리티를 사용하면 웹 애플리케이션에서 인증, 인가, 권한 부여 등의 보안 기능을 쉽게 구현할 수 있다. 스프링 시큐리티에는 일반적인 인증 방식뿐만 아니라 OAuth 2.0 인증 프로토콜도 지원한다.

OAuth 2.0은 인터넷에서 서비스를 제공하는 애플리케이션들 간에 사용자 정보를 안전하게 공유하기 위한 권한 부여 프레임워크이다. OAuth 2.0을 사용하면 사용자가 자신의 정보를 안전하게 공유할 수 있고, 개발자는 사용자 정보를 안전하게 사용할 수 있다.

이번 글에서는 스프링 시큐리티 OAuth 2.0을 활용한 인증 및 권한 부여에 대해 알아보도록 하자.

OAuth 2.0

OAuth 2.0 인증 절차의 이해

OAuth 2.0 인증 절차는 다음과 같다.

  1. 클라이언트는 사용자에게 권한 부여를 요청하는데, 이 때 사용자는 권한 부여 여부를 결정한다.
  2. 사용자가 권한 부여를 허용하면, 클라이언트는 인증 서버에 사용자 정보를 제공하고, 인증 서버는 클라이언트에게 액세스 토큰을 발급한다.
  3. 클라이언트는 액세스 토큰을 사용하여 보호된 리소스에 액세스할 수 있다.

OAuth 2.0 인증 절차는 간단하고 효율적이다. 사용자는 자신의 정보를 안전하게 공유할 수 있고, 클라이언트는 사용자 정보를 안전하게 사용할 수 있다.

스프링 시큐리티 OAuth 2.0 구현 방법

스프링 시큐리티 OAuth 2.0을 구현하는 방법은 다음과 같다.

  1. 의존성 추가

스프링 부트를 사용한다면, 스프링 부트 스타터를 사용하여 스프링 시큐리티 OAuth 2.0 의존성을 추가할 수 있다.


    org.springframework.boot
    spring-boot-starter-security
    2.4.5

    org.springframework.security
    spring-security-oauth2-client
    5.4.6
  1. 인증 서버 설정

스프링 시큐리티 OAuth 2.0을 사용하려면, 인증 서버를 구성해야 한다. 인증 서버는 액세스 토큰을 발급하고, 클라이언트의 요청을 검증하는 역할을 한다.

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private DataSource dataSource;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource);
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.checkTokenAccess("isAuthenticated()");
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }

}
  1. 클라이언트 설정

스프링 시큐리티 OAuth 2.0을 사용하는 클라이언트는 다음과 같이 구성할 수 있다.

@Configuration
@EnableOAuth2Client
public class OAuth2ClientConfig {

    @Bean
    public OAuth2ProtectedResourceDetails google() {
        AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
        details.setClientId("google-client-id");
        details.setClientSecret("google-client-secret");
        details.setUserAuthorizationUri("https://accounts.google.com/o/oauth2/auth");
        details.setAccessTokenUri("https://accounts.google.com/o/oauth2/token");
        details.setScope(Arrays.asList("email", "profile"));
        details.setPreEstablishedRedirectUri("http://localhost:8080/login/oauth2/code/google");
        details.setUseCurrentUri(false);
        return details;
    }

    @Bean
    public OAuth2RestTemplate restTemplate(OAuth2ClientContext clientContext) {
        return new OAuth2RestTemplate(google(), clientContext);
    }

}
  1. 보호된 리소스 설정

스프링 시큐리티 OAuth 2.0을 사용하여 보호된 리소스에 액세스하려면, 리소스 서버를 구성해야 한다. 리소스 서버는 클라이언트의 액세스 토큰을 검증하고, 보호된 리소스에 액세스할 수 있는지 확인하는 역할을 한다.

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/api/**").authenticated()
            .anyRequest().permitAll();
    }

}

권한 부여에 대한 스프링 시큐리티 OAuth 2.0의 활용

스프링 시큐리티 OAuth 2.0을 사용하여 권한 부여를 구현할 수 있다. 권한 부여는 사용자에게 특정 권한을 부여하는 것을 의미한다. 예를 들어, 관리자 권한을 가진 사용자만 특정 기능을 사용할 수 있도록 할 수 있다.

스프링 시큐리티 OAuth 2.0에서는 권한 부여를 위해 다음과 같은 방법을 제공한다.

1. Role 기반 권한 부여

스프링 시큐리티에서는 Role 기반 권한 부여를 지원한다. Role 기반 권한 부여는 사용자에게 특정 Role을 할당하여 권한을 부여하는 방식이다. 예를 들어, ROLE_USER, ROLE_ADMIN 등의 Role을 정의하고, 사용자에게 해당 Role을 할당하여 권한을 부여할 수 있다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasRole("USER")
            .anyRequest().permitAll()
            .and()
            .formLogin().loginPage("/login").permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("admin").password("{noop}admin").roles("ADMIN")
            .and()
            .withUser("user").password("{noop}user").roles("USER");
    }

}

2. Scope 기반 권한 부여

스프링 시큐리티 OAuth 2.0에서는 Scope 기반 권한 부여를 지원한다. Scope 기반 권한 부여는 클라이언트가 요청하는 Scope에 따라 사용자에게 권한을 부여하는 방식이다. 예를 들어, email, profile 등의 Scope에 대한 권한을 부여할 수 있다.

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/api/**").access("#oauth2.hasScope('email')")
            .anyRequest().permitAll();
    }

}

스프링 시큐리티 OAuth 2.0을 사용하여 권한 부여를 구현하면, 보안적인 측면에서 매우 안전하고 효율적인 방법을 사용할 수 있다.

결론

이번 글에서는 스프링 시큐리티 OAuth 2.0을 사용하여 인증 및 권한 부여를 구현하는 방법에 대해 알아보았다. 스프링 시큐리티 OAuth 2.0은 간단하고 효율적인 인증 프로토콜로, 사용자 정보를 안전하게 공유하며 보안적인 측면에서 매우 안전하고 효율적인 방법을 제공한다. 스프링 시큐리티 OAuth 2.0을 사용하여 보안 기능을 구현하면, 보안적인 측면에서 매우 안전하고 효율적인 애플리케이션을 구현할 수 있다.