JAVA/인증&보안

[인증/보안] Spring Security

코딩공대 2022. 11. 30. 10:01
728x90

1. Spring Security?

Spring MVC 기반 애플리케이션의 인증과 인가 기능을 지원하는 보안 프레임워크
  • Spring Security로 할 수 있는 보안 강화 기능
    1. 다양한 유형의 사용자 인증기능 적용(폼 로그인 인증, 토큰 기반 인증, OAuth 2 기반 인증, LDAP 인증)

    2. 애플리케이션 사용자의 역할에 따른 권한 레벨 적용(관리자, 일반사용자 등등)

    3. 애플리케이션에서 제공하는 리소스에 대한 접근 제어

    4. 민감한 정보에 대한 데이터 암호화

    5. SSL적용

    6. 웹 보안 공격 차단

    7. 기타 보안을 위한 대부분의 기능 지원
  • Spring Security에서 사용하는 용어 정리
    1. Principal(주체) : 애플리케이션에서 작업을 수행할 수 있는 사용자, 디바이스, 시스템 등이 될 수 있으며, 일반적으로 인증 프로세스가 성공적으로 수행된 사용자의 계정 정보

    2. Authentication(인증) : 애플리케이션을 사용하는 사용자가 본인이 맞음을 증명하는 절차를 의미한다, 인증을 정상적으로 수행하기 위해서는 사용자를 식별하기 위한 정보가 필요한데 이를 Credential(신원 증명 정보)라고 한다.                                               ※ Credential의 예 : 주민등록증 등의 신분증, 특정 사이트에 로그인 하기 위한 패스워드 등등

    3. Authorization(인가, 권한 부여) : 인증이 정상적으로 수행된 사용하에게 하나 이상의 권한을 부여하여 특정 애플리케이션의 특정 리소스에 접근할 수 있게 해준다. 인가, 권한 부여는 인증이 완료된 후 부여 되며 일반적으로 역할 형태로 부여된다.

    4. Access Control(접근 제어) : 사용자가 애플리케이션의 리소스에 접근하는 행위를 제어하는 것

2. Spring Security의 웹 요청 처리 흐름

웹 요청 처리 흐름도

  1. 사용자가 보호된 리소스를 요청한다.

  2. 인증 관리자 역할을 하는 컴포넌트가 사용자의 크리덴셜을 요청한다.

  3. 사용자는 인증 관리자에게 크리덴셜을 제공한다.

  4. 인증 관리자는 크리덴셜 저장소에서 사용자의 크리덴셜을 조회한다.

  5. 사용자가 제공한 크리덴셜과 크리덴셜 저장소에 저장된 크리덴셜을 비교해 검증 작업을 진행한다.

  6. 유효한 크리덴셜이 아니면 Exception을 Throw한다.

  7. 유효한 크리덴셜이면

  8. 접근 결정 관리자 역할을 하는 컴포넌트에서 사용자가 적절한 권한을 부여받았는지 검증한다.

  9. 적절한 권한을 부여받지 못한 사용자면 Exception을 Throw한다.

  10. 적잘한 권한을 부여받은 사용자면 보호된 리소스에 접근을 허용한다.
  • 웹 요청에서의 서블릿 필터와 필터 체인의 역할
서블릿 필터?
애플리케이션의 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로챈 후 어떤 처리를 할 수 있는 적절한 포인트를 제공하는 것
DelegatingFilterProxy?
서블릿 컨테이너 영역의 필터와 ApplicationContext에 Bean으로 등록된 필터들을 연결해주는 브릿지 역할을 한다.
FilterChainProxy?
일단, Spring Security의 FilterChain은 Spring Security에서 보안을 위한 작업을 처리하는 필터의 모음이고
Spring Security의 Filter를 사용하기 위한 진입점을 FilterChainProxy라고 한다.
FilterChainProxy부터 Spring Security에서 제공하는 보안 필터들이 필요한 작업을 수행한다.

3. Spring Security의 인증 처리 흐름

Spring Security의 컴포넌트로 보는 인증 처리 흐름

  1. 사용자가 로그인 폼 등을 이용해 Username과 Password를 포함한 request를 Spring Security가 적용된 애플리케이션에 전송한다.

  2. 사용자의 로그인 요청을 전달받은 UsernamePasswordAuthenticationFilter는 Username과 Password를 이용해 UsernamePasswordAuthenticationToken을 생성한다. (여기서 Authentication은 아직 인증이 되지 않았다.)

  3. 아직 인증되지 않은 Authentication을 가진 UsernamePasswordAuthenticationFilter는 해당 Authentication을 AuthenticationManager에게 전달한다.
     ※ AuthenticationManager는? 인증처리를 총괄하는 매니저 역할을 하는 인터페이스이고, AuthenticationManager를 구현한 클래스가 바로 ProviderManager이다.

  4. ProviderManager로 부터 Authentication을 전달 받은 AuthenticationProvider가

  5. UserDetailsService를 이용해 UserDetails를 조회한다.
     ※ UserDetails는? 데이터베이스 등의 저장소에 저장된 사용자의 Username과 사용자의 자격을 증명해주는 크리덴셜인 Password, 그리고 사용자의 권한 정보를 포함하고 있는 컴포넌트다.

  6. UserDetailsService는 데이터베이스 등의 저장소에서 사용자의 크리덴셜을 포함한 사용자 정보를 조회한다.

  7. 데이터베이스 등의 저장소에서 조회한 사용자의 크리덴셜을 포함한 사용자 정보를 기반으로 UserDetails를 생성한다.
  8. 생성된 UserDetails를 AuthenticationProvider에게 전달한다.

  9. UserDetails를 전달받은 AuthenticationProvider는 PasswordEncoder를 이용해 UserDetails에 포함된 암호화 된 Password와 인증을 위한 Authentication안에 포함된 Password가 일치하는지 검증한다.
     - 검증에 성공하면 UserDetails를 이용해 인증된 Authentication를 생성한다.
     - 검증에 성공하지 못하면 Exception을 발생시켜 인증을 중단한다.

  10. AuthenticationProvider에서 인증된 Authentication을 ProviderManager에게 전달한다.

  11. ProviderManager는 인증된 Authentication을 다시 UsernamePasswordAuthenticationFilter에게 전달한다.

  12. 마지막으로 SecurityContextHolder를 이용해 SecurutyContext에 인증된 Authentication를 저장한다.

4. Spring Security의 컴포넌트로 보는 권한 부여 처리 흐름

권한부여 처리 흐름

  1. AuthoriizationFilter는 SecurityContextHolder로 부터 Authentication을 획득한다.

  2. SecurityContextHolder로 부터 획득한 Authentication과 HttpServletRequest를 AuthorizationManager애개 전달한다.

  3. RequestMatcherDelegatingAuthorizationManager 내부에서 매치되는 AuthorizationManager 구현 클래스가 있다면 해당 AuthorizationManager 구현 클래스가 사용자의 권한을 체크한다.

  4. 적절한 권한이면 다음 프로세스를 계속 진행한다.

  5. 적절한 권한이 아니면 AccessDeniedException이 throw되고 ExceptionTranslationFilter가 AccessDeniedException을 처리하게된다.

5. 접근 제어 표현식

 

'JAVA > 인증&보안' 카테고리의 다른 글

[인증/보안] JWT TCP, CIA, RFC  (0) 2023.04.27
[인증/보안] OAuth2  (0) 2022.11.30
[인증/보안] JWT(JSON Web Token)  (0) 2022.11.30
[인증/보안] 기초  (0) 2022.11.30