기술 면접(security)

유요한·2024년 2월 24일
0

기술면접

목록 보기
16/27
post-thumbnail

Security

Spring Security는 Spring과는 별개로 작동하는 보안담당 프레임워크입니다. 보안은 모든 웹 애플리케이션의 가장 중요한 측면 중 하나이다. 사용자 데이터를 안전하게 유지하고 무단 접근을 방지하기 위해 개발자는 강력한 보안 조치를 구현해야 한다.

Spring Security는 자바 웹 애플리케이션을 위한 강력하고 유연한 보안 프레임워크이다. 인증, 권한 부여, 액세스 제어 같은 보안 기능을 제공하여 애플리케이션을 무단접근과 공격으로부터 보호한다. 인증(Authenticate,누구인지?)과 인가(Authorize, 어떤것을 할 수 있는지?)를 담당하는 프레임워크를 말합니다. 스프링 시큐리티에서는 주로 서블릿 필터(filter)와 이들로 구성된 필터체인으로의 구성된 위임모델을 사용합니다. 그리고 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안관련 로직을 작성하지 않아도 된다는 장점이 있습니다. 즉, Spring Security를 사용하면 개발자는 모든 것을 처음부터 구축하지 않아도 웹 애플리케이션에서 보안 조치를 쉽게 구현할 수 있습니다.

기본용어

  • 접근 주체(Principal) : 보호된 리소스에 접근하는 대상
  • 인증(Authentication) : 보호된 리소스에 접근한 대상에 대해 누구인지, 애플리케이션의 작업을 수행해도 되는 주체인지 확인하는 과정(ex. Form 기반 로그인) => 즉, 누구인지?
  • 인가(Authorize) : 해당 리소스에 대해 접근 가능한 권한을 가지고 있는지 확인하는 과정(After Authentication, 인증 이후) => 즉, 어떤 것을 할 수 있는지?
  • 권한 : 어떠한 리소스에 대한 접근 제한, 모든 리소스는 접근 제어 권한이 걸려있음. 인가 과정에서 해당 리소스에 대한 제한된 최소한의 권한을 가졌는지 확인

장점

자바 웹 애플리케이션에서 Spring Security를 사용하는 것에는 여러 가지 장점이 있는데, 가장 중요한 것은 사용자 데이터를 높은 수준으로 보호하는 매우 안전한 환경을 제공한다는 점이다. Spring Security는 암호화, 해시 같은 다양한 보안 조치를 사용하여 해커로부터 민감한 정보를 보호한다.

Spring Security의 또 다른 장점은 쉬운 사용성이다.
프레임워크는 로그인 페이지, 비밀번호 재설정 기능과 같은 미리 만들어진 보안 기능을 제공하므로 개발자는 쉽게 애플리케이션에 구현할 수 있다. 이는 개발자가 처음부터 모든 것을 구축할 필요가 없기 때문에 시간과 노력을 절약할 수 있게 해주는 것이다.

인증 과정

위 과정에서 사용된 UsernamePasswordAuthenticationFilter는 접근 권한을 확인하고 인증이 실패한 경우 로그인 폼이라는 화면을 보내는 역할을 수행합니다.

시큐리티 구조

웹에서 스프링 시큐리티는 기본적으로 아래와 같이 필터 기반으로 동작한다. 많은 필터들이 존재하며, DispatcherServlet 을 호출하기 전에 거치게 된다.

필터 체인

필터들은 위의 그림과 같이 체인되어 있다. 임의의 필터를 생성하고 원하는 필터 앞이나 뒤에 삽입하면 될 듯 하다.

동작 구조

  • Spring Security의 의존성을 추가한 경우 위와 같이 WebSecurityConfigurerAdapter클래스가 실행되게 됩니다.

  • WebSecurityConfigurerAdapter클래스는 스프링 시큐리티의 웹 보안 기능의 초기화 및 설정들을 담당하는 내용이 담겨있으며 내부 적으로 getHttp()메서드가 실행될 때 HTTPSecurity 클래스를 생성하게 됩니다.

  • 이때의 HTTPSecurity는 인증/인가 API들의 설정을 제공합니다.

  • 우리가 인증/인가의 설정을 바꾸고자 한다면 WebSecurityConfigurerAdapter클래스를 상속한 SecurityConfig클래스를 생성하여 configure(HttpSecurity http)메서드를 override하며 설정해야합니다.

Spring Security Filter

스프링 시큐리티는 필터를 기반으로 수행된다.

필터와 인터셉터의 차이는 실행되는 시점의 차이이다.

  • 필터는 dispatcher servlet으로 요청이 도착하기 전에 동작한다.
  • 인터셉터는 dispatcher servlet을 지나고 controller에 도착하기 전에 동작한다.

  • SecurityContextPersistenceFilter : SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할을 한다.

  • LogoutFilter : 설정된 로그아웃 URL로 오는 요청을 감시하며, 해당 유저를 로그아웃 처리

  • (UsernamePassword)AuthenticationFilter: (아이디와 비밀번호를 사용하는 form 기반 인증) 설정된 로그인 URL로 오는 요청을 감시하며, 유저 인증 처리

    • AuthenticationManager를 통한 인증 실행
    • 인증 성공 시, 얻은 Authentication 객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
    • 인증 실패 시, AuthenticationFailureHandler 실행
  • DefaultLoginPageGeneratingFilter : 인증을 위한 로그인폼 URL을 감시한다.

  • BasicAuthenticationFilter : HTTP 기본 인증 헤더를 감시하여 처리한다.

  • RequestCacheAwareFilter : 로그인 성공 후, 원래 요청 정보를 재구성하기 위해 사용된다.

  • SecurityContextHolderAwareRequestFilter : HttpServletRequestWrapper를 상속한 SecurityContextHolderAwareRequestWapper 클래스로 HttpServletRequest 정보를 감싼다. SecurityContextHolderAwareRequestWrapper 클래스는 필터 체인상의 다음 필터들에게 부가정보를 제공한다.

  • AnonymousAuthenticationFilter : 이 필터가 호출되는 시점까지 사용자 정보가 인증되지 않았다면 인증토큰에 사용자가 익명 사용자로 나타난다.

  • SessionManagementFilter : 이 필터는 인증된 사용자와 관련된 모든 세션을 추적한다.

  • ExceptionTranslationFilter : 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.

  • ExceptionTranslationFilter : 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.

💡 스프링 시큐리티 특징과 구조

  • 보안과 관련하여 체계적으로 많은 옵션을 제공하여 편리하게 사용할 수 있음

  • Filter 기반으로 동작하여 MVC와 분리하여 관리 및 동작

  • 어노테이션을 통한 간단한 설정

  • Spring Security는 기본적으로 세션 & 쿠키방식으로 인증

  • 인증관리자(Authentication Manager)와 접근 결정 관리자(Access Decision Manager)를 통해 사용자의 리소스 접근을 관리

  • 인증 관리자는 UsenamePasswordAuthenticationFilter, 접근 결정 관리자는 FilterSecurityInterceptor가 수행


CSRF란?

사이트 간 요청 위조(Cross-Site Request Forgery)

CSRF란 웹 애플리케이션의 취약점 중 하나로, 이용자가 의도하지 않은 요청을 통한 공격을 의미합니다. 즉 CSRF 공격이란, 인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(등록, 수정, 삭제 등)를 특정 웹사이트에 요청하도록 만드는 공격 입니다.


@EnableGlobalMethodSecurity

Spring Security에서 메서드 수준의 보안 설정을 활성화하는데 사용되는 어노테이션입니다. 이 어노테이션을 사용하면 메서드 단위의 접근 제어를 설정할 수 있으며,@Secured @PreAuthorize, @PostAuthorize와 같은 보안 어노테이션을 사용할 수 있게 됩니다.

@EnableGlobalMethodSecurity 어노테이션에는 두 개의 속성이 있습니다.

  • securedEnabled
    @Secured 어노테이션을 활성화할지 여부를 나타냅니다. @Secured 어노테이션은 메서드에 특정 권한을 가진 사용자만 접근할 수 있도록 지정하는데 사용됩니다.

  • prePostEnabled
    @PreAuthorize와 @PostAuthorize 어노테이션을 활성화할지 여부를 나타냅니다. @PreAuthorize 어노테이션은 메서드 실행 전에, @PostAuthorize 어노테이션은 메서드 실행 후에 특정 조건을 확인하여 접근을 허용하거나 거부하는데 사용됩니다.

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    // 추가적인 설정이 필요한 경우 여기에 작성할 수 있습니다.
}
@Service
public class MyService {
    @Secured("ROLE_ADMIN")
    public void doAdminTask() {
        // 관리자 권한이 있는 사용자만 이 메서드에 접근할 수 있습니다.
    }

    @PreAuthorize("hasRole('ROLE_USER')")
    public void doUserTask() {
        // 사용자 권한이 있는 사용자만 이 메서드에 접근할 수 있습니다.
    }

    @PostAuthorize("returnObject.userId == authentication.principal.userId")
    public MyData getUserData(int userId) {
        // 메서드 실행 후에 해당 데이터의 userId가 현재 인증된 사용자의 userId와 일치하는지 확인합니다.
        // 일치하는 경우에만 데이터를 반환합니다.
    }
}

변경점

WebSecurityConfigurer를 implements를 하거나 WebSecurityConfigurerAdapter를 extends하는 방법이 있습니다. 하지만 여기서 WebSecurityConfigurerAdapter에 선줄이 그어져 있는 것을 볼 수 있습니다. 이건 이제는 사용하지 않는다는 겁니다. 스프링 버전이 업데이트 됨에 따라 WebSecurityConfigurerAdapter와 그 외 몇 가지들이 Deprecated 됐습니다.

어떻게 변경되었지?

기존에는 WebSecurityConfigurerAdapter를 상속받아 설정을 오버라이딩 하는 방식이었는데 바뀐 방식에서는 상속받아 오버라이딩하지 않고 모두 Bean으로 등록을 합니다.

profile
발전하기 위한 공부

0개의 댓글