1.3.6 Spring Security

Spring Security는 애플리케이션의 보안 요구 사항을 충족시키기 위한 강력하고 맞춤화 가능한 인증 및 접근 제어 프레임워크입니다. 개발자가 보안 관련 보일러플레이트 코드 없이, 보다 쉽게 보안을 구현할 수 있도록 설계되었습니다.

인증(Authentication)과 권한 부여(Authorization)

인증은 사용자가 누구인지 확인하는 과정이며, 권한 부여는 인증된 사용자가 수행할 수 있는 작업을 결정하는 과정입니다.

인증

Spring Security는 다양한 인증 메커니즘을 지원합니다. 이를 통해 사용자 이름과 비밀번호를 기반으로 한 폼 인증, LDAP, OAuth2 등 다양한 인증 방식을 쉽게 구현할 수 있습니다.

  • 폼 기반 인증: 가장 일반적인 인증 방식으로, 사용자는 로그인 폼을 통해 자신의 자격 증명을 제공합니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll();
}

권한 부여

권한 부여는 특정 작업이나 리소스에 대한 접근을 제어합니다. Spring Security에서는 URL 접근 제어, 메소드 수준의 보안 등 다양한 방식으로 권한 부여를 구현할 수 있습니다.

  • URL 접근 제어: 특정 URL 패턴에 대한 접근을 제한합니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated();
}

OAuth2와 JWT를 사용한 보안

OAuth2는 인증을 위한 업계 표준 프로토콜로, 다른 애플리케이션에서 사용자 정보에 접근할 수 있게 해주는 안전한 방식을 제공합니다. JWT(JSON Web Tokens)는 토큰 기반 인증 시스템에서 널리 사용되는 포맷으로, 사용자의 정보를 JSON 객체에 저장합니다.

  • OAuth2 인증 서버 구성: Spring Security OAuth2는 인증 서버를 구성하여 토큰 기반의 인증을 제공합니다.
@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
               .withClient("clientId")
               .secret("secret")
               .authorizedGrantTypes("authorization_code")
               .scopes("read", "write");
    }
}
  • JWT 사용: 인증 정보를 JWT로 변환하여 제공함으로써, 상태를 유지하지 않는 RESTful 서비스에서도 사용자 인증 정보를 안전하게 전달할 수 있습니다.
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.accessTokenConverter(accessTokenConverter());
}

@Bean
public JwtAccessTokenConverter accessTokenConverter() {
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    converter.setSigningKey("secret");
    return converter;
}

Spring Security를 사용하면, 인증과 권한 부여, OAuth2와 JWT를 포함한 다양한 보안 메커니즘을 효과적으로 구현할 수 있습니다. 이를 통해 애플리케이션의 보안을 강화하고, 사용자 데이터를 보호할 수 있습니다.

source: DevOps/1.Programming_Languages_&_Frameworks/1.3.Spring/1.3.6.md