보안(인증, 인가, 권한)을 담당하는 프레임 워크이다.
인증과 인가
- 인증 : 사용자의 신원을 확인(인증)하는 과정
- 인가 : 사이트의 특정 부분에 접근할 수 있는지 권한을 확인하는 작업
스프링 시큐리티
- CSRF 공격, 세션 고정 공격을 방어, 요청 헤더 보안 처리 기능 제공
- 필터 기반 동작
주요 필터 :
- UsernamePasswordAuthenticationFilter : 인증 관리자, 폼 기반 로그인을 할 때 사용되는 필터로
- 아이디, 패스워드 데이터를 파싱해 인증 요청을 위임한다.
- FilterSecurityInterceptor : 접근 결정 관리자, 인가 관련 설정을 할 수 있음.\
로그인 과정
- HTTP 요청(아이디,패스워드 입력) 시 , HttpServletRequest에 아이디, 패스워드 정보가 전달 된다.
- 이때 AuthenticationFilter가 넘어온 아이디,비밀번호의 유효성 검사를 한다
- 유효성 검사가 끝나면 실 구현체인 UsernamePasswordAuthenticationToken 을 만들어 넘겨준다.
- 위 토큰을 AuthenticationManager(Interface)에게 보낸다.
- 토큰을 AuthenticationProvider에 보낸다.
- AuthenticationProvider가 사용자 아이디를 UserDetailService에 보낸다.
- UserDetailService는 사용자 아이디로 정보를 DB에 있는 사용자(구현 한 User) 정보를 가져온다.
- UserDetails(Interface) 객체로 만들어 다시 AuthenticationProvider에게 전달한다.
- 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 한다.
- 인증이 완료되면 SecurityContextHolder에 Authentication(객체)를 저장한다.
- 인증 성공 시 AuthenticationSuccessHandler, 실패 시 AuthenticationFailureHandler를 실행한다.
- Authentication 내의 정보
- principal
- 사용자를 식별
- 사용자의 고유 식별자와 암호로 인증이 이루어지는 경우 일반적으로 UserDetails 인터페이스를 구현하여 만듦
- 다른 경우 구현체 :org.springframework.security.core.userdetails.User
- credentials
- 암호 정보
- 사용자의 인증이 이루어진 후 지워짐
- Authorities
- AuthenticationManger에 의해 부여된 인가에 대한 정보
- 부여된 권한에 대한 정보는 GrantedAuthority로 추상화 (구현체 : SimpleGrantedAuthority) // 아래 내용 참고
- principal
- Authentication(인증)
- 스프링 시큐리티는 종합적인 인증 처리를 지원 (Principal & GrantAuthority 정보 제공)
- 특정 리소스에 접근하려고 하는 사용자가 누구인지를 확인할 때 사용
- 보통 사용자가 이름과 비밀번호를 입력하는 것으로 사용자를 인증
- 한번 인증하면 사용자를 식별하고 권한을 부여할 수 있다.
- 인증된 사용자 정보를 제공 (UserDetailsService를 리턴한 객체, UserDetails 타입)
◎ Password Storage
- 비밀번호를 안전하게 저장할 수 있도록 단방향 변환을 수행
- PasswordEncoder는 비밀번호를 단방향으로 변환
- 인증에 사용할 credential 정보를 저장
- PasswordEncoder 를 사용해서 저장하는 비밀번호는 인증 시점에 사용자가 입력하는 비밀번호와 비교하는 용도로 사용
- Password Storage history
◎ Servlet Authentication Architecture
- 서블릿 인증에서 사용하는 스프링 시큐리티의 주요 아키텍처 컴포넌트
- !https://velog.velcdn.com/images/gwichanlee/post/a160fd51-825b-4c6f-a5b2-934de48ac816/image.png
- SecurityContextHolder
- SecurityContextHolder만 알고있으면 인증 정보를 가져올 수 있다. (SecurityContext 제공)
- 스프링 시큐리티로 인증한 사용자의 상세 정보를 저장
- 값을 어떻게 넣을지 신경 쓰지 않고, 값이 있을 때 현재 인증한 사용자 정보로 사용
- SecurityContext
- SecurityContextHolder로 접근하는데 사용
- Authentication 객체를 가지고 제공함.
- GrantedAuthority
- Authentication.getAuthorities() 메서드로 접근, GrantedAuthority 객체의 Collection을 리턴
- 인증한 주체에게 부여된 권한을 뜻함 (Principal이 가진 권한을 나타냄)
- 권한은 보통 역할(role)을 의미하고 웹 인가, 메서드 인가, 도메인 객체 인가, 권한 확인 등에서 사용
- 이름/비밀번호 기반 인증을 사용한다면 UserDetailsService가 GrantedAuthority를 로드
- GrantedAuthority 객체는 애플리케이션 전체에 걸친 권한을 의미
- AuthenticationManager
- 스프링 시큐리티 필터의 인증 수행 방식을 정의하는 API
- AuthenticationManager를 호출한 객체(스프링 시큐리티의 필터)가 리턴한 Authentication을 SecurityContextHolder에 설정
- 스프링 시큐리티의 Filters를 사용하지 않을 경우엔 AuthenticationManager를 사용하지 않고 SecurityContextHolder에 직접 설정 가능
- AuthenticationManager 가장 많이 사용하는 구현체는 ProviderManager이다.
- 여러 ProviderManager 인스턴스에 동일한 부모를 공유하는 것도 가능
- 인증 매커니즘이 다른 SecurityFilterChain 여러 개가 공통 인증을 사용하는 경우에 흔히 쓰는 패턴
- !https://velog.velcdn.com/images/gwichanlee/post/b0205980-c8f5-41fd-aa6c-c479695a7f24/image.png
- ProviderManager
- AuthenticationManager 구현체
- ProviderManager는 동작을 AuthenticationProvider List에 위임함
- AuthenticationProvider 마다 각자 맡은 인증을 수행
- AuthenticationProvider는 인증을 성공 or 실패 or 결정을 내릴 수 없는 것으로 판단하여 다운스트림에 있는 AuthenticationProvider가 결정할 수 있도록 만들 수 있다.
- 설정해둔 AuthenticationProvider가 전부 인증에 실패하면 ProviderNotFoundException 예외 발생과 함께 실패
- 인증을 수행 할 수 있는 AuthenticationProvider가 없을 때 사용할 부모 AuthenticationManager를 설정할 수 있다. ( ProviderManager 인스턴스에 동일한 부모를 공유하는 것도 가능)
- !https://velog.velcdn.com/images/gwichanlee/post/38b2c8a6-d012-4e21-8dea-5fafcb99564b/image.png
- AuthenticationProvider
- AuthenticationProvier는 각 구현체의 authenticate() 메서드에서 정의된 특정 유형에 따른 인증을 수행
- ProviderManager에 AuthenticationProvider를 여러 개 주입 가능
- 각 AuthenticationProvider는 인증 성공, 실패 및 결정 할 수 없음을 나타낼 수 있고, 나머지 AuthenticationProvider가 결정할 수 있도록 전달한다.
- AuthenticationProvider 마다 담당하는 인증 유형이 다름
- 예시
- DaoAuthenticationProvider는 이름/비밀번호 기반 인증 지원 (기본으로 적용되는 구현체)
- JwtAuthenticationProvider는 JWT 토큰 인증 지원
- 사용자 이름과 암호를 통해 올바른 이름 및 암호인지 확인하기 위한 UserDetailService가 호출되고, 사용자가 인증되면 SecurityContext가 세션에 저장된다.
◎ 참고하면 좋은 자료
'Spring > security' 카테고리의 다른 글
권한제어 하는 여러가지 방법 (0) | 2024.01.24 |
---|