스프링 시큐리티란 ?
이론적인 부분입니다. 실제 사용방법은 따로 작성예정입니다...
추가예정 : authorization, OAuth2
HttpServletRequest
, HttpServletResponse
생성FilterChain
을 탄다// 필터체인 사용
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
// your codes ...
chain.doFilter(req, res);
}
DelegatingFilterProxy
서블릿 컨테이너와 ApplicationContext
를 연결하는 역할FilterChainProxy
: 그림에서 <?> 부분. 현재 요청에 대해 어떤 SecurityFilterChain
을 사용할 것인지 결정함SecurityFilterChain
: 드디어... 여기서부터 스프링 시큐리티 필터 체인 (스프링 시큐리티의 디폴트 설정.
덕분에 처음 시큐리티를 사용했을때 상당히 당황했었다...
springSecurityFilterChain
서블릿 필터를 생성 후 필터에 등록UserDetailsService
빈 생성 후 유저네임user
와 랜덤 비밀번호 생성스프링 시큐리티는 크게 Authentication(인증)과 Authorization(인가)로 나눌 수 있다.
인증은 내가 누구인지 식별하는 것, 인가는 내가 권한이 있는지를 확인하는 것이다.
인증의 핵심.
유저 정보를 담고있는 Authentication
을 저장한다.
시큐리티는 SecurityContextHolder
가 채워져 있다면 인증된 유저라고 판단한다.
public void securityContextHolderExample(){
// 인증을 하는 가장 간단한 방법 : 시큐리티 컨텍스트 홀더에 authentication을 넣어준다
SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
Authentication authentication =
new TestingAuthenticationToken("username", "password", "ROLE_USER");
securityContext.setAuthentication(authentication);
SecurityContextHolder.setContext(securityContext);
// 정보 꺼내기
SecurityContext context = SecurityContextHolder.getContext();
Authentication getAuthentication = context.getAuthentication();
String username = authentication.getName();
Object principal = authentication.getPrincipal();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
}
두 가지 목적으로 사용됨
1. AuthenticationManager
에 입력으로서 유저가 자격을 가졌는지 확인
2. 현재 인증된 유저 정보 확인
principal
: 유저 식별. username/password 방식에서는 UserDetails
의 인스턴스credentials
: passwordauthorities
: GrantedAuthority
의 인스턴스. role이라고 생각하면 됨인증을 어떻게 실행할 것인지를 정의하는 API
시큐리티의 필터 인스턴스에서 사용 (AbstractAuthenticationProcessingFilter)
주로 ProviderManager
구현체 사용
가장 많이 사용되는 AuthenticationManager
구현체
인증의 한 섹션. 특정한 인증을 실행한다.
예시 :
JwtAuthenticationProvider
는 Jwt token 인증을 담당DaoAuthenticationProvider
는 username/password 기반 인증을 담당시큐리티필터 체인에서 유저 인증을 담당하는 필터.
AuthenticationEntryPoint
를 사용해서 자격증명을 요청할 수 있음.
참고자료 : 스프링 시큐리티 공식문서