Spring Security는 보안(인증, 인가, 권한)을 담당하는 Spring 하위프레임워크이다.
Security는 Filter와 클래스들의 집합으로 이루어져있다.
인증 (Autentication)
- 현재 유저가 누구인지를 확인/ 애플리케이션의 작업을 수행할 수있는 주체인지를 증명
권한 (Authorization)
- 인증객체의 여부에 따라 애플리케이션의 동작을 수행할 수 있도록 허락되있는지는 결정
인가 (Authorize)
- 현재 유저가 어떤 서비스, 페이지에 접근할 수 있는 권한이 있는지 검사
Authentiction Flow(인증의 흐름)
1. Client 에서 로그인 요청
2. UsernamePasswordAuthenticationFIlter에서 ID + PASSWORD를 담은 인증객체(Authentication)를
생성한다.
3. AuthenticationManager에게 인증객체를 넘기며 인증처리를 위임한다.
→ 내부에 한 개 이상의 Provide를 담은 List를 가지고 있고 그 List에서 적절한 Provider를 찾는다.
4. 인증관리자(c)는 적절한 Provider(AuthenticationProvider)에게 인증처리를 위임한다.
5. 해당 Provider는 input 정보(id, password)를 가지고 실제 인증 처리 역할을 한다.
-a. loadUserByUsername(username)메서드를 호출해서 유저객체를 요청한다.
-b. UserDetailsService 인터페이스에게 loadUserByUsername(username) 요청
b-1.Repository에 findById() 유저 객체 조회를 한다.
b-2.만약, 해당 유저객체가 존재하지 않으면 UsernameNotFoundException이 발생하고
UsernamePasswordAuthenticationFIlter에서 예외를 처리를 한다
→ FailHandler()에서 후속처리
b-3.존재한다면 UserDetails 타입으로 반환된다.(Member 객체도 UserDetails 객체로 변환되어 반환)
6. 인증관리자(loadUserByUsername(username))는 이제 Password 검증을 시작한다.
-a. 인증객체의 Password와 반환받은 UserDetails의 Password를 비교한다.
a-1. 일치하지 않을 경우 BadCredentialException 발생 후 인증 실패
-b. 성공한 인증객체(UserDetals와 authorities를 담은 인증 후 토큰 객체 Authentication)를
UsernamePasswordAuthenticationFIlter에 전달한다.
7. SecurityContext에 저장한다.
8. 이후 전역적으로 SecurityContext에서 인증객체를 사용가능하게 된다
'Spring' 카테고리의 다른 글
JPA / ORM or SQL Mapper / Spring-data-JPA (0) | 2022.07.24 |
---|---|
Spring / request.getHeader() (0) | 2022.07.15 |
Spring / Spring Boot 에 Intercapter 란? (0) | 2022.07.14 |
Spring / Thymeleaf (0) | 2022.07.14 |