-> 정확한 /test URL만 일치.
-> /test, /test/, /test.html/, /test.xyz 등 다양하게 일치
스프링 시큐리티는 자바 애플리케이션에 인증과 인가를 제공하는 데 중점을 둔 프레임워크
기존 서블릿 필터에서 인증처리 한 것 보다,
custom requirements(맞춤형 요구사항)을 충족시키기 위해 굉장히 쉽게 확장 가능.
필터는 체인처럼 엮어있기 때문에 필터 체인이라고 불리는데, 모든 request는 이 필터 체인을 반드시 거쳐야 한다.
.authorizeRequests() - 요청에 대한 권한 지정 가능
.anyRequest().authenticated() - 인증이 되어야 한다는 이야기
.anonymous() - 인증되지 않은 사용자도 접근할 수 있다.
.fullyAuthenticated() - 완전히 인증된 사용자만 접근할 수 있다.
.hasRole() or hasAnyRole() - 특정 권한을 가지는 사용자만 접근할 수 있다.
.hasAuthority() or hasAnyAuthority() - 특정 권한을 가지는 사용자만 접근 가능
.haslpAddress() - 특정 아이피 주소를 가지는 사용자만 접근할 수 있다.
.access() - SpEL? 표현식에 의한 결과에 따라 접근할 수 있다.
.not() - 접근 제한 기능을 해제
.permitAll() or denyAll() - 접근을 전부 허용하거나 제한한다.
.rememberMe() - 로그인한 사용자만 접근할 수 있다. 리멤버 가능 -> 단순히 아이디나 토큰을 기억하는게 아니라 로그인 정보를 유지하는 방법.
스프링 시큐리티는 사용자 정보를 UserDetails 구현체로 사용.
그래서 스프링 시큐리티는 User라는 클래스 제공.
하지만 이름과 패스워드 권한들에 대한 필드만 있음.
이메일 정보나 프로필 이미지 경로 등과 같은 부가적인 정보는 담을 수 없다.
따라서 UserDetails 구현체를 직접 만들어야함.
클라이언트가 인증과정을 성공했을때와 실패했을 경우 Handler를 implementation해서 custom 가능
spring security 내부 구조
*** WebSecurityConfigurerAdapter를 상속받는 클래스에 @EnableWebSecurity어노테이션을 선언하면 SecurityFilterChain이 자동으로 포함됨.
WebSecurityConfigurerAdapter를 상속받아서 메서드 오버라이딩을 통해 보안 설정을 커스터마이징하는 것이 SpringSecurity의 핵심적인 일.
AuthenticationManager
인증 요청을 받고 Authentication을 채움.
유저의 request가 담긴 Authentication을 AuthenticationManager에 넘겨주고,
AuthenticationManager를 구현한 ProviderManager가 처리.
정확히는 ProviderManager는 private List provider; 로 여러 AuthenticationProvider를 가질 수 있는데, 이것들이 처리를 해서 Authentication를 반환해준다.(실패하면 예외를 던짐)
AuthticationProvider
실제 인증이 일어나며, 성공하면 Authentiction.isAuthenticated = true 함.
Authentication
모든 접근 주체(=유저)는 Authentication 생성.
이것은 SecurityContext에 보관되고 사용.
즉, security의 세션들은 내부 메모리(SecurityContextHolder)에 쌓고 꺼내쓰는 것.
Authentication 인터페이스에 상속받는 UserDetails 인터페이스가 중요한 이유.
BcryptPasswordEncoder
Bcrypt 해시 함수를 사용한 PasswordEncoder.
Bcrypt는 애초부터 패스워드 저장을 목적으로 설계
password를 무작위로 여러번 시도해 맞추는 해킹을 방지 위해 암호를 확인할 때 의도적으로 느리게 설정.
BcryptPasswordEncoder는 강도를 설정할 수 있는데 강도가 높을수록 오랜 시간이 걸린다.