필터, 인터셉터 직접 구현하며 느낀 것들

Ryu·2022년 11월 16일
0

Spring Security 를 활용해 로그인 과 관련한 부분을 구현해보았는데, 필터, 인터셉터 등 로그인 기능 구현에 필요한 개념들을 학습해보았고 이를 정리해보려 한다.
단순 개념 설명, 이론 정리는 이미 노션 페이지에 개인적으로 기록하고 있어서, 블로그에는 직접 코딩하면서 겪었던 에러 상황들이나, 중요하다고 생각하는 부분들에 대해서 재가공하여 다루려고 한다.


doFilter

  • 필터 인터페이스에서 가장 중요한 메서드인데, 이 로직이 없으면 다음단계로 진행조차 안 된다. 다음 필터가 있으면 그 필터를 호출하고, 없다면 서블릿을 호출한다.
  • 이 메서드를 오버라이딩해서 필터 로직 기능을 구현한다.
  • 파라미터에 ServletRequest 가 있는데, '범용성'을 위해 HttpServletRequest의 부모인 ServletRequest 를 사용했다. 실제 로직 구현에서는 다운캐스팅을 통해 HttpServletRequest 를 사용해야 했다!

필터를 사용하려면 왜 빈 등록을 해야할까 ?

  • 필터를 사용하기 위해서 빈 등록이 반드시 필요하다고 한다.
    빈 등록하게 되면, 스프링 컨테이너에서 싱글톤 객체로 관리한다는 정도로 알고 있었고, 구체적으로 왜 빈 등록을 해야하는지 모르겠어서 찾아보았다.
  • 찾아보니, FilterRegistrationBean 을 따로 등록을 해줘야 필터 기능 사용이 가능했다.
    스프링 부트가 WAS(톰캣)을 띄울 때, 필터를 같이 넣어주는 작업이라고 한다.

좋은 코드는 항상 유지보수성이 좋다!

  • 직접 코드를 짜보면서, whiltelist 라는 배열을 만들어 인증을 거치지 않는, 요청을 항상 허용해주는 경로들을 따로 관리했다.
  • 물론, 위에서 등록한 빈에 따로 설정을 해줄 수 있었지만,
    그렇게 하지 않고 따로 배열을 만들어서 관리하는 이유는 '유지보수' 때문이다.
  • 매번 느끼는거지만, 너무 좋은 성능보다는 가독성이고, 불필요한 로직이 추가되더라도 추후 유지보수가 쉽게 설계된 코드가 좋은 코드인 것 같다!!

🤔 에러 : 로그인 페이지가 안 나오는 문제

  • 로그인 실패 후 로그인 성공 시 기존 요청한 페이지 리다이렉션 기능 추가 했는데, 로그인 페이지가 안나오는 문제가 발생했다.

😀 해결

  • doFIlter() 에서 whitelist 부분은 필터인증 안되도록 해야 하는데, 실수가 있었다.
  • isLoginCheckPath() 메서드를 통해서, 이 값이 true 이면, 해당 조건에 대해서만 인증 필터 로직이 실행되도록 구현했어야 함. → 이 부분 빼먹어서, 모든 경로에 대해 필터 인증이 들어가서 오류난거였다.

인터셉터, 왜 필터 말고 이걸 사용하지 ?

서블릿 필터와 다르게 메서드의 호출 시점이 완전히 분리되어 있다!

  • 필터의 경우, 메서드의 호출 시점이 모두 WAS가 생성된 후, 서블릿 객체로 넘어가기 전에 있다.
  • 그러나 인터셉터는 메서드마다 다양한 곳에서 호출된다. 자세한 사항은 스프링 MVC 구조와 관련이 있어서 생략하겠다.
  • 그렇기에 인터셉터가 훨씬 더 편리하고 정교하게 사용 가능하다! (다양한 곳에서 체크해줄 수 있으므로...)
profile
Strengthen the core.

0개의 댓글