Spring Security?
스프링 기반의 애플리케이션에서 보안(인증과 권한)을 제공하는 프레임워크입니다.
스프링 시큐리티는 사용자 인증(authentication)과 권한 부여(authorization)를 처리하며, 웹 애플리케이션 및 서비스의 보안을 강화하는데 사용됩니다. 이 프레임워크를 사용하면 보안 처리를 자체적으로 구현하지 않아도 쉽게 필요한 기능을 사용할 수 있습니다.
Spring Security의 인증(authentication)과 인가(authorization)
스프링 시큐리티는 다양한 인증 및 권한 부여 방식을 지원합니다.
가장 기본적인 인증방식은 사용자 이름과 비밀번호를 이용한 폼 인증(form-based authentication)입니다. 이외에도 HTTP 기본 인증, OAuth, OpenID Connect 등 다양한 인증 방식을 지원합니다.
인가 방식으로는 권한(role) 기반 부여와 접근 제어 리스트(ACL, Access Control List) 기반 부여 등이 있습니다.
Role은 특정한 권한 집합을 나타내는 역할을 합니다. 예를 들어, "ROLE_USER"와 "ROLE_ADMIN" 등의 롤을 구분하고 그에 따른 권한을 부여합니다.
ACL은 특정 객체에 대한 권한을 지정하며, 예를 들어 특정 사용자의 특정 파일에 대한 읽기, 쓰기 권한을 부여합니다.
Spring Security의 인증(authentication) 과정
(1)사용자가 로그인 정보와 함께 인증 요청(HTTP Request)을 합니다.
(2)전달된 요청 정보(Request의 Username, password)를 토대로 AuthenticationFilter가 UsernamePassword Authentication Token(인증용 객체)를 생성합니다.
(3)AuthenticationFilter는 AuthenticationManager에게 생성된 Authentication 객체와 함께 인증 요청을 전달합니다.
(4)AuthenticationManager는 등록된 AuthenticationProvider 중에서 해당하는 AuthenticationProvider를 찾아 인증 요청을 전달합니다.
(5)해당 AuthenticationProvider는 실제 DB에서 사용자 인증 정보를 가져오는 UserDetailService에 사용자 정보를 전달합니다.
(6)UserDetailService는 넘겨받은 사용자 정보를 통해 DB에서 찾은 사용자 정보인 UserDetails 객체(User)를 생성합니다.
(7)~(8)AuthenticationProvider는 UserDetails 객체를 넘겨받고 Authentication Manager에게 전달합니다.
(9)Authentication Manager는 UserDetailsService에서 조회한 사용자 정보와 사용자가 직접 입력한 정보를 비교하여 인증을 처리합니다. 인증이 성공하면 인증된 Authentication 객체를 반환합니다.
(10)인증이 성공한 경우, AuthenticationFilter는 Authentication 객체를 SecurityContextHolder의 SecurityContext에 저장합니다.
*인증 실패 시 AuthenticationException을 던지고 예외 처리 과정으로 이동합니다.
로그인이 성공하면, 사용자는 인증된 상태로 요청을 처리할 수 있게 됩니다.
Spring Security의 인가(authorization) 과정
(1)스프링 시큐리티에서 보호된 자원에 접근하려는 요청이 들어옵니다.
(2)FilterSecurityInterceptor가 이를 가로채고, SecurityContextHolder로부터 Authentication 인증 객체를 얻습니다.
(3)FilterSecurityInterceptor는 보호된 자원에 대한 접근 요청을 처리하기 위해 FilterInvocation 객체를 생성합니다.
(4)~(5)FilterInvocation을 SecurityMetadataSource에 전달하고 *ConfigAttribute 객체를 생성합니다.
(6)생성된 ConfigAttribute 객체와 Authentication 객체가 AccessDecisionManager에게 전달됩니다.
(7)AccessDecisionManager는 AccessDecisionVoter에게 접근 권한 판단을 요청합니다. 각 Voter들은 사용자의 권한을 확인하기 위해 Authentication 객체를 사용합니다. 접근 권한이 허용되지 않으면 AccessDeniedExceptionㅇ이 발생합니다.
(8)AccessDecisionManager는 최종적으로 접근 권한을 결정합니다. 접근 권한이 허용된다면, FilterInvocation을 통해 요청을 처리(9)~(10)합니다.
*보통 인가(Authorization)는 사용자의 권한(Authentication 객체)과 자원의 접근 권한을 비교하여 결정됩니다.
*ConfigAttribute는 자원(Resource)에 대한 접근 권한을 나타내는 인터페이스입니다.
'spring(스프링)' 카테고리의 다른 글
[spring(스프링)] Dispatcher Servlet이란? _디버깅의 눈물 (0) | 2023.04.06 |
---|---|
[spring(스프링)] DTO, VO, Entity의 차이? _디버깅의 눈물 (0) | 2023.04.04 |
[spring(스프링)] OAuth란? _디버깅의 눈물 (0) | 2023.03.20 |
[spring(스프링)] 스프링 빈 라이프 사이클 _디버깅의 눈물 (0) | 2023.03.18 |
[spring(스프링)] MVC 패턴이란? _디버깅의 눈물 (0) | 2023.03.13 |