minkukjo님의 글을 참고하여 작성했습니다.
javax.servlet-api
혹은 tomcat-embed-core
를 사용하면 framework에서 서블릿 리퀘스트를 가장 먼저 거치는 Servlet Filter 인터페이스다.
스프링에서 위 Filter를 확장해서 제공해주는 필터 인터페이스다.
무엇을 확장했느냐?
스프링의 설정 정보를 확인할 수 있도록 도와준다.
내부에 들어가면 어떤 설정을 확인할 수 있는지 알 수 있다. 거기다 setter를 제공한다고 한다.
앞의 두 필터는 매 서블릿 마다 호출이 되지만 이 필터는 요청 단위로 한번만 호출된다.
공부중인 Spring Security
에서 Authentication과 Access control이 Filter로 구현돼있다.
이 Authentication과 Access Control 필터는 RequestDispatcher 클래스에 의해 다른 서블릿으로 dispatch되는데 만약 Filter
나 GenericFilterBean
으로 JWT authentication filter를 만들었다면 이동할 서블릿에 도착하기 전에 한번 더 이 필터를 거치게 된다.
필터를 두 번 거치는 문제를 막기 위해 OncePerRequestFilter
를 사용할 필요성을 느꼈다.
참고
https://minkukjo.github.io/framework/2020/12/18/Spring-142/
PasswordEncoder passwordEncoder = new BcryptPasswordEncoder();
대부분 Bcrypt암호화 알고리즘을 사용한다. 기본적으로 비밀번호의 암호화는 단방향인데 만약 비밀번호 알고리즘을 바꾸려고 한다면 상당한 노력이 필요하다. 따라서 아래와 같은 방법을 사용했다.
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
그 안에 createDelegatingPasswordEncoder()
를 살펴보면 아래와 같다.
public static PasswordEncoder createDelegatingPasswordEncoder() {
String encodingId = "bcrypt";
Map<String, PasswordEncoder> encoders = new HashMap<>();
encoders.put(encodingId, new BCryptPasswordEncoder());
encoders.put("ldap", new LdapShaPasswordEncoder());
encoders.put("MD4", new Md4PasswordEncoder());
encoders.put("MD5", new MessageDigestPasswordEncoder("MD5"));
encoders.put("noop", NoOpPasswordEncoder.getInstance());
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
encoders.put("SHA-1", new MessageDigestPasswordEncoder("SHA-1"));
encoders.put("SHA-256", new MessageDigestPasswordEncoder("SHA-256"));
encoders.put("sha256", new StandardPasswordEncoder());
return new DelegatingPasswordEncoder(encodingId, encoders);
}
다양한 방법이 구현돼 있고, 암호화를 하면 앞에 {id}
가 붙는다.
{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
{noop}password
{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc
{scrypt}$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0