250x250
반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 코딩학습
- spring
- graph DB
- 파이썬
- Apple
- Kotlin
- iPad
- 아이폰
- 유니티
- neo4j
- unity
- 한글
- 스프링
- 튜토리얼
- 윈도우10
- 녹화프로그램
- Tutorial
- Python
- AWS
- SQL
- programmers
- kakao
- 윈도우
- 영상편집
- json
- 프로그래머스
- 애플
- 코틀린
- 아이패드
- DaVinci Resolve
Archives
- Today
- Total
코드짜는 노인네
[Spring] Spring Security 이해 본문
728x90
반응형
[Spring] Spring Security 이해
스프링 시큐리티(Spring Security)
스프링 기반의 애플리케이션의 보안 (인증과 인가 등)을 담당하는 스프링 하위 프레임 워크입니다. 주로 서블릿 필터(filter)와 이들로 구성된 필터체인으로 구성된 위임모델을 사용합니다.
- 인증(Authenticate) : 유저가 누구인지 확인하는 절차
- 인가(Authorize) : 유저에 대한 권한을 허락하는 절차
Spring Security 특징
- Filter 기반으로 동작하여 MVC와 분리하여 관리 및 동작
- 어노테이션(@)을 통한 간단한 설정
- 세션 & 쿠키 방식으로 인증
- 라이브러리 추간만으로 login/logout 기능 제공
- SecurityConfig 와 UserDetailsService 를 통해 인증 환경 커스텀 가능
기본용어
- 접근 주체 (Principal)
- 보호된 리소스에 접근하는 대상
- 인증 (Authentication)
- 보호된 리소스에 접근한 대상이 누구인지, 애플리케이션의 작업을 수행해도 되는 주체인지 확인하는 과정
- 실질적으로 인증정보를 담고 있는 객체
- 인가 (Authorize)
- 해당 리소스에 대한 접근 권한을 가지고있는지 확인하는 과정
- 권한
- 일부 리소스에 대한 접근 제한, 모든 리소스에 접근 제어 권한이 걸려있으며, 인가 (Authorize) 과정에서 해당 리소스에 대한 제한된 최소한의 권한을 가졌는지 확인
인증정보를 담고 있는 객체
Principal
- 인증 주체에 대한 정보를 담고 있는 객체
/**
* 회원 페이지 (인증필요, USER 이상의 권한 접근 가능)
*/
// Controller
@GetMapping("/user")
public String user(Model model, Principal principal) {
// Principal을 통해 인증 주체가 누구인지 알 수 있다.
model.addAttribute("username", principal.getName());
return "/user";
}
// HTML (타임리프)
<title>User 페이지</title>
</head>
<body>
<h1>회원 화면</h1>
<p>th:text="${username}" 님 환영합니다.</p>
</body>
Authentication
- 실질적으로 인증정보를 담고 있는 객체
Principal | - 접근하는 대상이 누군지에 대한 정보를 담고 있는 객체 - 로그인_ID에 해당하는 값을 담고 있다. |
Credentials | - 인증자격에 대한 정보를 담고 있는 객체 - 비밀번호와 같은 암호 값을 담고 있다. |
Authorities | - 현재 유저의 권한(ROLE)정보를 담은 객체 |
SecurityContextHolder
- 시큐리티가 최종적으로 제공하는 객체
Spring Security 구조
- UsernamePasswordAnthenticationFilter : 인증 관리자
- FilterSecurityInterceptor : 접근 결정 관리자
각 필터별 기능 설명
- SecurityContextPersistenceFilter
- SecurityContextRepository에서 SecurityContext를 로드하고 저장하는 일을 담당
- 인증된 SecurityContext를 세션에 캐시하는 필터
- 인증 전 세션에 인증정보가 있는지 체크
- 세션에 정보가 있으면 복구해서 재사용(로그인 유지)
- 세션에 정보가 없으면, 인증을 실행
인증 흐름
- SecurityContextPersistenceFilter에서 로그인이 됐는 지 세션체크 (있으면 세션정보로 로그인처리)
- [1]이 없는 경우 UsernamePasswordAuthenticationFilter로 폼인증 시작 (AuthenticationManager) 호출
- ProviderManager(&AuthenticationManager)를 통해 인증처리
- UsernamePasswordAuthenticationFilter를 통해 SecurityContextHolder 객체로 리턴
- SecurityContextPersistenceFilter를 통해 인증정보를 세션에 담는다.
- LogoutFilter
- 로그아웃 URL로 지정된 가상 URL에 대한 요청을 감시하고 매칭되는 요청이 있으면 사용지를 로그아웃시킴
- UsernamePasswordAuthenticationFilter
- 사용자명과 비밀번호로 이뤄진 폼기반 인증에 사용하는 가상 URL요청을 감시하고 요청이 있으면, 사용자의 인증을 진행한다.
- 해당 필터에서 AuthenticationManger를 호출
- 여기서 AuthenticationManger 란?
- 인증 처리 관련 인터페이스
- authenticate(Authentication authentication) 메서드를 통해 인증을 구현한다.
- 여기서 AuthenticationManger 란?
- 인증 후 받은 Authentication 객체를 SecurityContextHolder로 포장
참고 - 인증처리의 흐름
[ProviderManager > authenticate(Authentication)]
ProviderManager 클래스 - AuthenticationManager의 구현체 - 실제 인증을 처리한다. |
- 인자로 받은 로그인 정보로 userDetailsService의 User정보를 가져온다.
- 가져온 정보에 대한 유효성 검증(계정잠김, 만료여부 등)
- 이상이 없다면 Authentication 객체로 리턴
물론 처리 과정에서 다른 클래스들을 거치기도 한다.
- DaoAuthenticationProvider
- userDetailsService 접근할 때
- AbstractUserDetailsAuthenticationProvider
- 유효성 검증 할 때
- DefaultLoginPageGeneratingFilter
- 폼기반 또는 OpenID 기반 인증에 사용하는 가상URL에 대한 요청을 가시하고 로그인 폼 기능을 수행하는데 필요한 HTML을 생성
- BasicAuthenticationFilter
- HTTP 기본 인증 헤더를 감시하고 이를 처리함
- RequestCacheAwareFilter
- 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청을 재구성하는데 사용
- AnonymousAuthenticationFilter
- 이 필터가 호출되는 시점까지 사용자가 아직 인증을 받지 못했다면 요청 관련 인증 토큰에서 사용자가 익명 사용자로 나타나게 됨
- SessionManagementFilter
- 인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체와 관련한 모든 세션들이 트래킹되도록 도움
- ExceptionTranslationFilter
- Spring Security에서 인증/인가 예외 처리 필터
- FilterSecuritylnterceptor
- AccessDecisionManager를 통해 인가 혹은 예외를 던진다
- AccessDecisionManager 인터페이스
- 인가 처리 관련 인터페이스
- 인가 결정을 내리는 인터페이스로 3가지 구현체를 제공
- Voter : 의사결정을 내리는데 사용되는 수단
- AffirmativeBased
- 여러 Voter중에 하나라도 충족하면 허용
- 기본전략
- ConsensusBased : 다수결
- UnanimousBased : 만장일치
- decide() 메서드를 통해 인가로직 구현
- supports(ConfigAttribute attribute)
- hasRole(), permitAll()과 같은 설정을 확인하는 메서드
- AccessDecisionManager 인터페이스
- 권한부여와 관련한 결정을 AccessDecisionManager에게 위임해 권한부여 결정 및 접근 제어 결정을 쉽게 만들어줌
- AccessDecisionManager를 통해 인가 혹은 예외를 던진다
시큐리티가 기본적으로 제공하는 필터들
설정에서 특정 필터를 비활성하거나, 사용자 정의 필터를 추가하지 않는다면, 아래의 15개의 필터를 기본적으로 활성화한다.
- WebAsyncManagerIntergrationFilter
- SecurityContextPersistenceFilter
- HeaderWriterFilter
- CsrfFilter
- LogoutFilter
- UsernamePasswordAuthenticationFilter
- DefaultLoginPageGeneratingFilter
- DefaultLogoutPageGeneratingFilter
- BasicAuthenticationFilter
- RequestCacheAwareFtiler
- SecurityContextHolderAwareReqeustFilter
- AnonymouseAuthenticationFilter
- SessionManagementFilter
- ExeptionTranslationFilter
- FilterSecurityInterceptor
참고 자료
[Spring Security] 스프링시큐리티의 기본 개념과 구조
[Spring Security] 스프링시큐리티의 개념/시작하기 /기본세팅 💡 스프링시큐리티(Spring Security)란? 스프링 시큐리티는 스프링 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프
devuna.tistory.com
스프링 시큐리티 흐름과 구조
스프링 시큐리티의 인증/인가 흐름과 구조, 스프링 시큐리티가 제공하는 필터들
velog.io
728x90
반응형
'spring' 카테고리의 다른 글
[Spring boot] 스프링 부트 Json 파일 읽어오기 (0) | 2022.09.06 |
---|---|
[Spring] MVC - Request (0) | 2022.08.22 |
[SpringBoot] SpringBoot 프로젝트 생성방법 (0) | 2022.08.22 |
[Spring] CORS (Cross Origin Resource Sharing) (0) | 2022.07.24 |
[Spring] 클라이언트에서 보낸 데이터 서버에서 받는 방법 (@PathVariable, @RequestParam, @ModelAttribute, @RequestBody) (0) | 2022.07.22 |
Comments