본문 바로가기
Team

[CS 스터디] Spring Security

by seungh2 2023. 8. 2.

Spring Security

  • a powerful and highly customizable authentication and access-control framework.
  • 강력하고 사용자 정의가 가능한 인증 및 접근 제어 프레임워크
  • 인증 및 권한 부여에 대한 포괄적이고 확장 가능하다.

보안 3요소

Principal 접근 주체

  • 특정 리소스에 접근하는 사용자

Authentication 인증

  • 주체의 신원을 증명하는 과정
  • 특정 리소스에 접근하려는 사용자의 신원을 확인하는 것
  • 일반적으로는 사용자에게 사용자 이름과 비밀번호를 입력하도록 한다.

Authorization 인가. 권한 부여

  • 인증을 마친 사용자에게 권한을 부여해 애플리케이션의 특정 리소스에 접근할 수 있게 허가해주는 과정
  • 인증된 사용자의 권한을 확인해야 한다. → 인증 과정 후에 수행

Spring Security와 보안 3요소

🔷Authentication

  • 현재 접근 주체의 정보를 담는 클래스
  • 인증 요청을 할 때, 요청 정보를 담는다.  principal, credentials, authorities를 포함한다.

주요 메소드

String getName() // 사용자 이름
Object getCredential() // credential ex) 비밀번호
boolean isAuthenticated() // 인증 여부
Collection getAuthorities() // 현재 사용자가 가진 권한 (GrantedAuthority)

SecurityContext

  • Authentication을 보관한다.
  • Spring Security에서 현재 접근 주체에 대한 Authentication 객체를 구할 때 사용한다.

SecurityContextHodler

  • SecurityContext를 보관한다. (기본적으로는 thread local에 보관)
  • 누가 인증되었는지에 대한 세부 정보를 저장하는 곳
  • 즉, 인증된 주체에 대한 정보를 얻을 수 있다.

 

  • Authentication을 SecurityContext에 담고, 해당 SecurityContext를 SecurityContextHolder에 담아 보관한다.

GrantedAuthority

  • 사용자에게 부여된 권한
  • Roles이나 Scopes가 있다.
  • Authentication의 getAuthorities는 GrantedAuthority의 모음이다.
  • 일반적으로 Roles를 사용한다. ex) ROLE_USER, ROLE_ADMINISTRATOR
  • Role은 나중에 웹 권한, 메서드 권한, domain object 권한을 위해 구성된다.
  • 사용자 이름/비밀번호를 기반으로 한 Authentication을 사용할 때, GrantedAuthority는 보통 UserDetailService에 의해 로드된다.

🔷Authentication Manager

  • 인증을 처리하는 클래스
  • Spring Security의 filter가 인증을 수행하는 방법을 정의한다.
  • Spring Security의 필터를 통한 인증 과정을 정의하는 중요한 API
  • Spring Security의 호출되며 최종적인 접근 제어의 결정을 담당한다.
  • 구현체는 다양하지만, 가장 많이 사용하는 구현체는 ProviderManger

메서드

// 인증을 처리한다.
// 인증 요청은 AuthenticationProvider에 의해 처리
// 인증에 성공하면 인증 정보를 담고 있는 Authentication 객체를 반환
// 여기서 반환된 Authentication 객체를 SecurityContext에 보관
// 인증에 실패하면 AuthenticationException
Authentication authenticate(Authentication authentication)

AuthenticationProvider

  • 특정 유형의 인증을 수행한다.
  • JWTAuthenticationProvider는 JWT 토큰 인증을 지원하고
  • DaoAuthenticationProvider는 사용자 이름/비밀번호 기반 인증을 지원한다.

ProviderManger

AuthenticationProvider의 체인을 관리한다.

다양한 유형의 인증을 처리할 수 있도록 도와준다.

Abstract Authentication ProcessiongFilter

  • 사용자의 자격 증명을 인증하기 위한 기본 필터

 

 

  1. 사용자가 자격 증명을 제출하면 HttpServletRequest에서 Authentication을 만든다. 
    • 생성된 Authentication 타입은 추상 인증 처리 필터의 하위 클래스에 따라 달라진다.
    • ex) UsernamePasswordAuthenticationFilter는 HttpServletRequest에 있는 사용자 이름과 비밀번호로 UsernamePasswordAuthenticationToken을 생성한다.
  2. 인증할 Authentication을 AuthenticationManager로 전달한다.
  3. 인증에 실패한다.
    • SecurityContextHolder를 지운다.
    • RememberMeServices의 loginFail이 호출된다.
    • Authentication Failure Handler가 호출된다.
  4. 인증에 성공한다.
    • 새로운 로그인이 SessionAuthenticationStrategy에 알려진다.
    • Authentication은 SecurityContextHolder에 기억된다.
    • RememberMeServices의 loginSuccess가 호출된다.
    • ApplicationEventPublisher는 대화형 인증 성공 이벤트를 게시한다.
    • AuthenticationSuccessHandler가 호출된다.

 

🔷 AuthorizationFilter

  • 인가를 처리하는 클래스
  • AuthorizationManger를 사용해 url에 대한 접근을 제어한다.
  • HttpServletRequest에 대한 권한 부여를 한다.
  • 기본적으로 SpringSecurity의 FilterChain에 마지막에 위치한다.
  • AuthorizationFilter 앞에 직접 필터를 추가하면 해당 필터는 권한을 요구하지 않게 되며, 뒤에 추가하면 권한이 필요하게 된다.
  • 모든 요청뿐만 아니라 모든 dispatch에서 실행된다.
    • request dispatch뿐만 아니라, error dispatch, include dispatch 등에서도 인가가 필요하다는 것을 의미한다.

AuthorizationManger

  • AuthorizationFilter에 호출된다.
  • 최종 접근 제어 결정을 내리는 책임을 가진다.
  • 가장 흔한 구현체는 AuthorityAuthorizationManger(인가 중 권한에 대한 처리를 담당)

메소드

// 인가 결정을 내리기 위해 필요한 정보를 넘기는 메소드
AuthorizationDecision check(Supplier<Authentication> authentication, Objecct secureObject)

// check 메소드를 호출한다.
// 계속 실패하는 AuthorizationDecision인 경우 AccessDeninedException을 던진다.
default AuthorizationDecision verify(Supplier<Authentication> authentication, Object secureObject)

 

원래는 FilterSecurityInterceptor  가 인가를 처리하였는데, deprecated 되면서 AuthorizationFilter를 사용한다.

Understanding How Request Authorization Components Work

 

  1. AuthorizationFilter가 SecurityContextHolder에서 Authentication을 가져온다.
    • 이때, Supplier<Authentication>을 사용한다.
  2. AuthorizationFilter는 Authentication을 HttpServletRequest를  AuthorizationManger에게 전달한다.
    • AuthorizationManger는 authorizeHttpRequests에 지정된 패턴과 요청을 비교해 해당하는 규칙을 실행한다.
  3. 인가가 거부되었다면, AuthorizationDeniedEvent가 발생하고, AccessDeninedException이 발생한다.
  4. 인가가 허용되었다면, AuthorizationGrantedEvent가 발생하고, AuthorizationFilter는 FilterChain과 함께 진행되며 애플리케이션이 정상적으로 처리되도록 한다.

Supplier<Authentication>

  • Supplier 인터페이스를 사용해 Authentication 객체를 생성하는 역할을 한다.
  • Authentication 객체를 생성하는 함수 역할을 하며, 이 함수를 호출해 인증 객체를 얻을 수 있다.
  • Supplier 인터페이스는 Java8부터 도입된 함수형 인터페이스로, 매개변수를 받지 않고 값을 반환하는 메서드를 가진 인터페이스.
    • 즉, 값을 생성하거나 반환하는 역할을 한다.
  • SpringSecurity에서는 Supplier<Authentication> 를 사용하여 Authentication 객체를 생성하거나 반환하는데 활용한다.
    • ex) 인증 프로세스에서 사용자의 자격증명을 확인하고 유효한 인증 객체를 생성하여 반환할 때 사용한다.

Using Authorization Expression Fields and Methods

  • permitAll 
    • 권한이 필요하지 않는 공개 엔드포인트.
    • 이 경우 Authentication은 세션에서 가져오지 않는다.
  • denyAll
    • 어떤 경우에도 요청이 허용되지 않는다.
    • 이 경우 Authentication은 세션에서 가져오지 않는다.
  • hasAuthority
    • Authentication이 주어진 값과 일치하는 GrantedAuthority를 가져야 한다.
  • hasRole
    • ROLE_ 또는 기본 접두사로 구성된 값과 일치하는 GrantedAuthority를 가져야 한다.
  • hasAnyAuthority
    • Authentication이 주어진 값 중 어느 하나와 일치하는 GrantedAuthority를 가져야 한다.
  • hasAnyRole
    • ROLE_ 또는 기본 접두사로 구성된 값 중 어느 하나와 일치하는 GrantedAuthority를 가져야 한다.
  • access
    • 사용자 정의 AuthorizationManager를 사용하여 요청의 접근을 결정한다.

 

예시

<http>
    <intercept-url pattern="/static/**" access="permitAll"/>
    // /static으로 시작하는 모든 URL은 누구나 접근할 수 있다.
    <intercept-url pattern="/admin/**" access="hasRole('ADMIN')"/>
    // /admin으로 시작하는 모든 URL은 ROLE_ADMIN 역할을 가져야 한다.
    <intercept-url pattern="/db/**" access="hasAuthority('db') and hasRole('ADMIN')"/>
    // /db로 시작하는 모든 URL은 db 권한이 있어야 하고, ROLE_ADMIN 역할을 가져야 한다.
    <intercept-url pattern="/**" access="denyAll"/>
    // 위에서 매치되지 않은 모든 URL에 대한 접근은 거부
</http>

참고

https://docs.spring.io/spring-security/reference/5.8/servlet/authentication/architecture.html#servlet-authentication-authentication

 

Servlet Authentication Architecture :: Spring Security

ProviderManager is the most commonly used implementation of AuthenticationManager. ProviderManager delegates to a List of AuthenticationProviders. Each AuthenticationProvider has an opportunity to indicate that authentication should be successful, fail, or

docs.spring.io

https://www.slideshare.net/madvirus/ss-36809454

 

스프링 시큐리티 구조 이해

스프링 시큐리티 구조 이해 (웹 어플리케이션 중심) 신림 프로그래머, 최범균, 2014-07-09 목표 ● 스프링 시큐리티의 구성 요소와 동작 방식 이 해 ○ 이를 통한 커스터마이징 포인트 잡기! 기본

www.slideshare.net

https://docs.spring.io/spring-security/reference/servlet/authorization/authorize-http-requests.html

 

Authorize HttpServletRequests :: Spring Security

While using a concrete AuthorizationManager is recommended, there are some cases where an expression is necessary, like with or with JSP Taglibs. For that reason, this section will focus on examples from those domains. Given that, let’s cover Spring Secu

docs.spring.io

https://tech-monster.tistory.com/217

 

[Spring Security] AuthorizationFilter로 HttpServletRequests 인증하기 (Authorize HttpServletRequests with AuthorizationFilte

지난 시간에는 Spring Security의 인가 구조에 대해 알아보았다. (지난 내용이 궁금하다면 여기 🤦‍♀️🤦‍♀️ 클릭!!) 이번 시간에는 AuthorizationFilter로 HttpServletRequests를 어떻게 인증하는지 알아

tech-monster.tistory.com

 

728x90

'Team' 카테고리의 다른 글

[CS 스터디] Annotation  (0) 2023.08.24
[CS 스터디] S3에 파일을 업로드 하는 방법  (0) 2023.08.17
[CS 스터디] AI, 메타버스, 블록체인  (0) 2023.07.26
[CS 스터디] 클라우드와 분산환경  (0) 2023.07.19
[CS 스터디] Git  (0) 2023.07.13

댓글