[Spring] 스프링 시큐리티 및 OAuth2 통합

Jiwoo Jung·2025년 1월 8일
0

GDGoC Spring 스터디

목록 보기
14/15

GDG on Campus Backend-Spring 스터디 WIL
Week 08 - 스프링 시큐리티 및 OAuth2 통합

Spring Security 기초

velog.io/@jiu-jung


Access Control

RBAC(Role Based Access Control, 역할 기반 접근 제어)

정보에 대한 접근 권한을 역할에 따라 결정.

장점

  • 보안 강화 & 데이터 보호
  • 그룹화 통해 권한 관리 간소화
  • 다수의 사람에 대해 유연하고 직관적이며 효율적인 통제 가능

기본 규칙

  • Role Assignment (역할 할당)
  • Role Authorization (역할 기반 권한 부여)
  • Permission Authorization (권한 승인)

구현 예시

geeksforgeeks.org

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .requestMatchers("/user/**").hasRole( "USER")
                .anyRequest().authenticated()
                .and()
                .formLogin()
               // Specify the URL for the registration page

                .and()
                .logout().logoutSuccessUrl("/").permitAll();

        return http.build();
    }
    
}
@Configuration
public class UserDetailsConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public UserDetailsManager userDetailsManager() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(
                User.withUsername("admin")
                        .password(passwordEncoder().encode("admin"))
                        .roles("ADMIN")
                        .build()
        );
        manager.createUser(
                User.withUsername("user")
                        .password(passwordEncoder().encode("user"))
                        .roles("USER")
                        .build()
        );
        return manager;
    }
}

메소드 수준 보안 (Method-Level Security)

RBAC를 서비스 계층으로 확장한 방식.

  • @Configuration 클래스에서 @EnableMethodSecurity 활성화 필요

    @Configuration
    @EnableMethodSecurity
    public class SecurityConfig { 
        // Other security configurations here 
    }
  • @PreAuthorize : 메소드 실행 전 권한 체크

    @PreAuthorize("hasRole('ROLE_ADMIN') or (hasRole('ROLE_USER') and #userId == principal.userId)") 
    public void updateUser(int userId) { 
    // Method logic here 
    }
  • @PostAuthorize : 메소드 실행 후 반환값에 따라 접근 제어

  • @Secured : 특정 역할 기반으로 접근 제어

    @Secured("ROLE_ADMIN") 
    public void deleteUser(int userId) { 
    // Method logic here 
    }

ACL(Access Control List, 액세스 제어 목록)

개별 리소스에 대한 접근을 세분화하여 정의 및 관리

장점

  • 리소스 단위 권환 관리 -> 리소스(도메인 객체)에 사용자/그룹별 권한 부여
  • hasPermission()을 통해 접근성 관리 DB화
  • Spring security는 spring-security-acl 라이브러리 제공)

단점

  • 도메인 객체가 갖는 접근성에 대한 정보 활용 X -> ACL 테이블 별도로 관리
  • 사용자/도메인 객체가 많아지면 접근 권한에 대한 경우의 수가 기하급수적으로 증가
  • 기술 난이도가 높아 유지보수 어려움

기본 구조

  • Sid(Security Identity) - 사용자/그룹
  • Permission - 객체에 대한 권한
  • Domain Object - 보호할 객체

ACL 도메인 모델

ACL_CLASS : 도메인 객체의 종류
ACL_SID : 권한의 주체가 되는 사용자 정보 & Role 정보
ACL_OBJECT_IDENTITY : 보안의 대상이 되는 정보 객체
ACL_ENTRY : 접근 권한 정보


OAuth 2.0 (Open Authorization)

docs.spring.io

인터넷 사용자가 애플리케이션에 직접 비밀번호를 제공하지 않고, 권한을 위임하여 리소스에 접근하도록 하는 프로토콜

  • 개방형 표준 프로토콜로, third-party 프로그램에게 리소스 소유자를 대신해 리소스 서버에서 제공하는 자원에 대한 접근 권한을 위임하는 방식으로 작동
  • third-party 프로그램(구글, 카카오 등)에게 로그인 및 개인정보 관리에 대한 권한을 위임하여 third-party 프로그램이 가지고 있는 사용자에 대한 리소스 조회 가능

주요 구성 요소

  • Resource Owner(리소스 소유자) : 보호된 자원에 접근할 수 있는 자격을 부여해주는 객체. OAuth 2.0 프로토콜 흐름에서 클라이언트 인증하는 역할 수행
  • Client(애플리케이션) : 보호된 자원을 사용하기 위해 접근을 요청하는 애플리케이션
  • Authentication Server : 사용자의 보호된 자원을 호스팅하는 서버
  • Resource Server : Authentication Server로 인증/인가 수행. Client의 접근 자격을 확인하고 Access Token을 발급하여 권한을 부여한다.

인증 방식

Authorization Code Grant

기본이 되는 방식
간편 로그인에서 많이 사용
권한 부여 승인을 위해 자체 생성한 Authorization Code 를 전달하는 방식으로 많이 쓰임

Implicit Grant

자격증명을 안전하게 저장하기 힘든 클라이언트(ex. 자바스크립트 등의 스크립트언어 없이 사용한 브라우저)에게 최적화된 방식
권한 부여 승인 코드 없이 바로 Access Token 발급
응답성과 효율성은 높아지지만 Access Token이 URL로 전달된다는 단점 존재

Resource Owner Password Credential Grant(자원 소유자 자격증명 승인 방식)

username, password로 Access_Token을 받는 방식
권한서버, 리소스 서버, 클라이언트가 모두 같은 시스템에 있을 때 사용

Client Credential Grant(클라이언트 자격증명 승인 방식)

클라이언트의 자격증명만으로 Access Token 획득하는 가장 간단한 방식
자신이 관리하는 리소스 혹은 권한 서버에 해당 클라이언트를 위한 제한된 리소스 접근 권한이 설정되어 있는 경우 사용

Spring Security & Oauth 2.0 통합

  1. `application.property``파일에 Oauth2.0 클라이언트 설정 추가
  2. build.gradle에 의존성 추가
  3. SecurityConfig 클래스에서 리소스 서버의 보안 구성 정의

장점

  • 복잡한 인증 및 인가 요구사항을 효과적으로 관리 가능
  • OAuth 2.0 -> 사용자 데이터에 대한 안전한 접근 권한 부여 가능
  • Spring Security -> 프로세스를 간소화하여 구현할 수 있는 풍부한 기능 제공
  • 개발자는 보안이 강화된 애플리케이션을 쉽고 빠르게 구축 가능

참고자료

velog.io/@eileen0379
techdocs.broadcom.com

0개의 댓글