일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- HTTP
- 라이프 사이클
- HTTP 메서드
- javascript
- JPA
- Stateless
- Spring
- Java
- cache
- 의존성 주입
- BEAN
- Vue.js
- thymeleaf
- Excel
- 캐시
- 로그인
- vuex
- Security
- 싱글톤
- VUE
- 프로토타입
- js
- DB
- vue-cli
- Singleton
- dependency injection
- Kotlin
- Repository
- di
- Setter
- Today
- Total
jhhan의 블로그
Spring - Security 본문
Spring에 대해 배우다 보니 Security도 다뤄야 할 부분이 생겨서
Security도 어느정도 정리하려고 합니다.
** Security부분이어서 보안관련 탭으로 이동했습니다...
이번 글은 아래의 블로그를 참조했습니다.
https://coding-start.tistory.com/153
Security
- Spring 기반의 애플리케이션의 보안을 담당하는 Spring 하위 프레임워크이다.
- 주로 서블릿 필터와 이들로 구성된 필터체인으로의 위임모델을 사용합니다.
- 보안과 관련해서 많은 옵션을 제공하므로 보안관련 로직 작성을 생각하지 않으셔도 됩니다.
보안용어
- 접근 주체(Principal) : 보호된 리소스에 접근하는 대상
-
인증(Authentication) : 보호된 리소스에 접근한 대상에 대해 유저가 누구인지, 작업을 수행해도 되는 주체인지 확인하는 과정
-
인가(Authorize) : 해당 리소스에 대해 접근 권한을 가지고 있는지 확인
-
권한 : 어떤 리소스에 대한 접근 제한. 인가과정에서 해당 리소스에 대한 제한된 최소한의 권한을 가졌는지 확인
Security Filter
-
SecurityContextPersistenceFilter : SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할
-
LogoutFilter : 설정된 로그아웃 URL로 오는 요청 감시, 해당 유저 로그아웃 처리
-
(UsernamePassword)AuthenticationFilter : 설정된 로그인 URL로 오는 요청 감시, 유저 인증 처리 (form 기반 인증)
-
AuthenticationManager를 통한 인증 실행
-
성공 시 : Authentication객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
-
실패 시 : AuthenticationFailureHandler 실행
-
DefaultLoginPageGeneratingFilter : 인증을 위한 로그인폼 URL감시
-
BasicAuthenticationFilter : HTTP 기본인증 헤더 감시
-
RequestCacheAwareFilter : 로그인 성공 후, 원래 요청 정보를 재구성하기 위해 사용
-
SecurityContextHolderAwareRequestFilter : HttpServletRequestWrapper 상속
-
SecurityContextHolderAwareRequestWapper : 클래스, HttpServletRequest 정보를 감싼다.
-
SecurityContextHolderAwareRequestWrapper : 클래스, 필터 체인상의 다음 필터들에게 부가정보 제공
-
AnonymousAuthenticationFilter : 이 필터가 호출되기 전까지 사용자 정보가 인증되지 않았다면 인증토큰에 사용자가 익명 사용자로 나타난다.
-
SessionManagementFilter : 인증된 사용자와 관련된 모든 세션 추적
-
ExceptionTranslationFilter : 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임 혹은 전달 역할
-
FilterSecurityInterceptor : AccessDecisionManager로 권한부여 처리를 위임 -> 접근제어 결정을 쉽게 해준다.
Authentication
-
접근 주체는 Authentication객체를 생성합니다.
-
이 객체는 SecurityContext에 보관되고 사용됩니다.
AuthenticationManager
-
유저의 요청을 AuthenticationFIlter에서 Authentication객체로 변환합니다.
-
AuthenticationManager(ProviderManager)에게 넘겨준 후
-
AuthenticationProvider(DaoAuthenticationProvider)가 실제 인증 한 후
-
인증이 완료되면 Authentication객체를 반환합니다.
-
Spring Security는 ProviderManager라는 AuthenticationManager인터페이스의 유일한 구현체를 제공합니다.
-
ProviderManager는 하나 또는 여러개의 AuthenticationProvider 구현체 사용이 가능합니다.
비밀번호 인증과정
-
DaoAuthenticationProvider는 UserDetailsService 타입 오브젝트로 위임합니다.
-
UserDetailsService는 UserDetails 구현체를 리턴하는 역할입니다.
-
UserDetails와 Authentication은 유사하지만 목적이 다른 인터페이스입니다.
-
Authentication : 아이디, 패스워드와 인증 요청 컨텍스트에 대한 정보를 가지고 있습니다. 인증 이후 사용자 상세정보와 같은 UserDetails 타입 오브젝트를 포함할 수 있습니다.
-
UserDetails : 이름, 이메일, 전화번호 가틍ㄴ 사용자 프로필 정보를 저장하기 위한 용도입니다.
인증 예외
-
AuthenticationException을 상속한다.
-
AuthenticationException은 두개의 멤버 필드를 가집니다.
-
authentication : 인증 요청 관련 Authentication객체를 저장합니다.
-
extraInformation : 인증 예외 관련 부가 정보를 저장합니다.
-
대표적인 예외들
-
BadCredentialsException : 사용자 아이디가 전달되지 않거나 인증 저장소의 사용자 아이디에 해당하는 패스워드가 일치하지 않을 경우 발생합니다.
-
LockedException : 사용자 계정이 잠긴 경우 발생합니다.
-
UsernameNotFoundException : 인증 저장소에 사용자 ID를 찾을 수 없거나 사용자 ID에 부여된 권한이 없을 경우 발생합니다.
접근권한 부여
-
Spring Security 필터 체인의 마지막 서블릿 필터 = FilterSecurityInterceptor
-
이 필터는 해당 요청의 수락 여부를 결정합니다.
-
FilterSecurityInterceptor가 실행되는 시점에서 이미 사용자가 인증되어 있을 것이기 때문에 유효한 사용자인지도 확인합니다.
-
AccessDecisionManager라는 컴포넌트가 인증 확인 처리합니다.
-
AccessDecisionManager인터페이스는 인증확인을 위해 2개의 메소드 제공
-
supports : AccessDecisionManager구현체는 현재 요청을 지원하는지의 여부를 판단하는 2개의 메소드 제공. 파라미터는 하나는 java.lang.Class, 다른 하나는 ConfigAttribute 타입
-
decide : 요청 컨텍스트와 보언 설정을 참조하여 접근 승인 여부 결정. 리턴값이 없지만 접근 거부를 의미하는 예외 던짐->요청 거부된것을 알림
-
특정 타입의 예외클래스를 사용하면 권한처리하는 애플리케이션의 동작을 좀더 세밀하게 제어 가능합니다.
-
AccessDecisionManager는 표준 스프링 빈 바인딩과 레퍼런스로 설정 가능(디폴트)
-
AccessDecisionManager 구현체는 AccessDecisionVoter와 Vote 취합기반 접근 승인 방식 제공함
-
Voter는 권한 처리 과정에서 다음을 평가한다.
-
보호된 리소스에 대한 요청 컨텍스트(URL을 접근하는 IP주소)
-
사용자가 입력한 비밀번호
-
접근하려는 리소스
-
시스템에 설정된 파라미터와 리소스
-
Voter는 사용할 수 있는 정보를 사용해서 사용자의 리소스에 대한 접근 허가 여부를 판단합니다.
-
세가지 중 한 가지를 결정
-
Grant(ACCESS_GRANT) : 접근 권한을 허가하도록 권장
-
Deny(ACCESS_DENY) : 접근 권한을 거부하도록 권장
-
Abstain(ACCESS_ABSTAIN) : 접근 권한 결정을 보류
'보안관련' 카테고리의 다른 글
Spring Security(2) (0) | 2020.04.23 |
---|---|
CSRF (0) | 2020.03.03 |