6회차

CJY·2023년 5월 26일
0

프로젝트1

목록 보기
6/8

minkukjo님의 글을 참고하여 작성했습니다.

Filter vs GenericFilterBean vs OncePerRequestFilter

Filter

javax.servlet-api 혹은 tomcat-embed-core를 사용하면 framework에서 서블릿 리퀘스트를 가장 먼저 거치는 Servlet Filter 인터페이스다.

GenericFilterBean

스프링에서 위 Filter를 확장해서 제공해주는 필터 인터페이스다.
무엇을 확장했느냐?
스프링의 설정 정보를 확인할 수 있도록 도와준다.

내부에 들어가면 어떤 설정을 확인할 수 있는지 알 수 있다. 거기다 setter를 제공한다고 한다.

OncePerRequestFilter

앞의 두 필터는 매 서블릿 마다 호출이 되지만 이 필터는 요청 단위로 한번만 호출된다.

공부중인 Spring Security에서 Authentication과 Access control이 Filter로 구현돼있다.

이 Authentication과 Access Control 필터는 RequestDispatcher 클래스에 의해 다른 서블릿으로 dispatch되는데 만약 FilterGenericFilterBean으로 JWT authentication filter를 만들었다면 이동할 서블릿에 도착하기 전에 한번 더 이 필터를 거치게 된다.

필터를 두 번 거치는 문제를 막기 위해 OncePerRequestFilter를 사용할 필요성을 느꼈다.

참고
https://minkukjo.github.io/framework/2020/12/18/Spring-142/

PasswordEncoder

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

참고
https://java.ihoney.pe.kr/498

profile
열심히 성장 중인 백엔드

0개의 댓글