❗Spring Security란?
스프링 시큐리티란 스프링 애플리케이션에서 보안을 관리하는 프레임워크로 사용자 인증, 접근 제어를 통해 보안을 강화할 수 있다. 다양한 인증 및 권한 부여 방법을 제공해서 커스텀이 용이하게 하고, 개발자의 편의성을 확대시킨다.
❗Spring Security 구성 요소
Authentication(인증) | 사용자가 본인이 맞는지 확인 주로 아이디, 비밀번호 방식을 사용 Principal: 접근 주체(아이디) / Credential: 비밀번호 |
Authorization(권한 부여) | 인증된 사용자가 어떤 자원에 접근할 수 있는지 결정 스프링 시큐리티는 선언적 방식을 통해 URL 접근 제어, 메소드 접근 제어 등을 제공 |
Security Filter Chain | http 요청을 처리하기 전 거쳐가는 필터의 집합 인증, 권한 부여, CSRF 보호 등이 있음 |
Security Context | 인증된 사용자의 정보와 주어진 권한 정보를 저장하는 곳 SecurityContextHolder를 통해 어디서든 Security Context에 접근 가능 |
❗ Spring Security 동작 흐름
1. 사용자의 로그인 정보와 함께 HTTP 요청 수신:
- 사용자가 로그인 폼을 제출하면 사용자 이름(username)과 비밀번호(password)를 포함한 HTTP POST 요청이 서버로 전송됩니다.
2. AuthenticationFilter가 요청을 가로채고, 정보를 통해 UsernamePasswordAuthenticationToken의 인증용 객체를 생성:
- 스프링 시큐리티의 AuthenticationFilter (예: UsernamePasswordAuthenticationFilter)가 이 요청을 가로채고, 사용자가 입력한 username과 password를 추출합니다.
- 이를 통해 UsernamePasswordAuthenticationToken 객체를 생성합니다.
3. 필터를 통해 AuthenticationToken를 ProviderManager로 UsernamePasswordToken을 위임:
- 생성된 UsernamePasswordAuthenticationToken 객체는 AuthenticationManager로 전달됩니다. 이때 보통 ProviderManager가 사용됩니다.
4. AuthenticationManager가 AuthenticationProvider에서 조회 후 인증을 시도:
- AuthenticationManager는 적절한 AuthenticationProvider를 찾아 인증을 시도합니다.
5. UserDetailsService에 사용자의 정보를 넘겨줌:
- DaoAuthenticationProvider는 UserDetailsService를 사용하여 사용자 정보를 가져옵니다.
- 사용자 이름(username)을 UserDetailsService에 전달합니다.
6. 넘겨받은 사용자 정보를 통해 DB에서 사용자 정보를 찾아서 UserDetails 객체로 만듦:
- UserDetailsService는 사용자 이름을 기반으로 데이터베이스 또는 다른 저장소에서 사용자 정보를 조회하여 UserDetails 객체를 생성합니다.
7. AuthenticationProvider는 UserDetails을 넘겨받고 사용자 정보를 비교:
- DaoAuthenticationProvider는 UserDetails 객체와 사용자가 입력한 비밀번호를 비교하여 인증을 시도합니다.
- 비밀번호는 PasswordEncoder를 사용하여 비교됩니다.
8. 인증 객체 또는 AuthenticationException 반환:
- 인증이 성공하면 Authentication 객체를 반환하고, 실패하면 AuthenticationException을 발생시킵니다.
- 인증된 Authentication 객체는 사용자의 권한 정보를 포함합니다.
9. AuthenticationFilter에 Authentication 객체 전달:
- 인증이 성공하면, AuthenticationFilter는 인증된 Authentication 객체를 받습니다.
10. Authentication 객체를 Security Context에 저장:
- SecurityContextHolder를 사용하여 현재 스레드의 SecurityContext에 Authentication 객체를 저장합니다.
11.SecurityContextHolder는 세션 영역에 있는 SecurityContext에 Authentication 객체를 저장:
- 기본적으로 스프링 시큐리티는 세션 기반 인증을 사용합니다.
- 따라서, SecurityContext는 세션에 저장되고, 이후의 요청에서 인증된 사용자 정보를 유지합니다.
728x90
반응형
'🔻Back-End > Spring' 카테고리의 다른 글
[Spring] JPA Native Query + Projection (0) | 2023.02.01 |
---|---|
[Spring error] Error running . Command line is too long (0) | 2023.01.11 |
[Spring error] Cannot call sendError() after the response has been committed (0) | 2023.01.07 |
[Spring] MySQL, MariaDB, H2 DB 연결하는 application.yml 설정 (0) | 2023.01.07 |
[Spring] JPA ddl-auto 옵션 정리 (0) | 2023.01.06 |