(https://images.velog.io/images/tololong001/post/b7cb6e79-d6ea-40a7-ae55-baad03317216/image.png)
< 상위 그림은 Spring Security 의 흐름이다. >
인증 (Authentication)
: 해당 사용자가 본인이 맞는지를 확인하는 절차이다.
인가 (Authorization)
: 인증 된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차
Principal
을 아이디로, Credential
을 비밀번호로 사용하는 Credential 기반의 인증 방식 을 사용한다.
- Principal (접근 주체) : 보호 받는 리소스에 접근하는 대상
- Credentail (비밀번호) : 리소스에 접근하는 대상의 비밀번호
Authentication
은 현재 접근하는 주체의 정보와 권한을 담는 interface 이다.SecurityContext
에 저장되며, SecurityContextHolder
를 통해 SecurityContext
에 접근하고, SecurityContext
를 통해 Authentication
에 접근할 수 있다.Autentication
을 보관하는 역할을 하며, SecurityContext
를 통해 Autentication
객체를 꺼내올 수 있다.SecurityContextHolder
는 보안 주체의 세부 정보를 포함하여 응용 프로그램의 현재 보안 컨텍스트에 대한 세부 정보가 저장된다.username
과 password
를 조합해서 UsernamePasswordAuthenticationToken
인스턴스를 생성한다.AuthenticationManager
는 인증에 성공하면 Authentication
인스턴스를 return한다.Authentication
인스턴스는 SecurityContextHolder
에 저장한다.Authentication
을 implement
한 AbstractAutheniicationToken
의 하위 클래스로 username
이 Principal
의 역할을 하고, password
가 Credential
의 역할을 한다.public class UsernamePasswordAuthenticationToken extends AbstractAuthenticationToken {
// 주로 사용자의 username에 해당함
private final Object principal;
// 주로 사용자의 password에 해당함
private Object credentials;
// 인증 완료 전의 객체 생성
public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
super(null);
this.principal = principal;
this.credentials = credentials;
setAuthenticated(false);
}
// 인증 완료 후의 객체 생성
public UsernamePasswordAuthenticationToken(Object principal, Object credentials,
Collection<? extends GrantedAuthority> authorities) {
super(authorities);
this.principal = principal;
this.credentials = credentials;
super.setAuthenticated(true); // must use super, as we override
}
}
Authentication
객첼,르 받아서 인증이 완료된 객체를 반환하는 역할이다.AuthenticationManager
를 통해서 처리하게 되는데, 실질적으로는 AuthenticationManager
에 등록된 AuthenticationProvider
에 의해서 처리된다.isAuthenicated = true
인 객체를 생성하여 SecurityContext
에 저장한다.AuthenticationException
을 발생시킨다.DaoAuthenticationProvider
는 AbstracUserDetailsAuthenticationProvider
를 상속받아 실제 인증 과정에 대한 로직을 처리한다.AuthenticationManager
에 DaoAuthenticationProvider
를 등록하는 방법은 WebSecurityConfigureAdaper
를 상속해 만든 ApplicationSecurityConfig
에서 할 수 있다. @Configuration
@EnableWebSecurity
public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter {
private final PasswordEncoder passwordEncoder;
@Autowired
public ApplicationSecurityConfig(PasswordEncoder passwordEncoder,) {
this.passwordEncoder = passwordEncoder;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(daoAuthenticationProvider());
}
@Bean
public DaoAuthenticationProvider daoAuthenticationProvider() {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setPasswordEncoder(passwordEncoder);
provider.setUserDetailsService(applicationUserService);
return provider;
}
}
UserDetails
객체는 UsernamePasswordAuthenticationToken
을 생성하기 위해 사용된다.UserDetails
interface 의 경우 직접 개발한 ApplicationUser
에 UserDetails
를 implements 하여 사용하면 된다. UserDetails
객체를 반환하는 단 하나의 메소드를 가지고 있다.UserRespository
를 주입 받아 DB에 연결하여 처리된다.ROLE_ADMIN
, ROLE_USER
, ROLE_
의 형태로 사용된다. 출처 : https://velog.io/@dnjscksdn98/Spring-Spring-Security%EB%9E%80