팀 프로젝트의 마지막 스프린트 기간을 보냈다.
이번주에 한 주요 작업은
- 공통 BaseErrorCode 정의
- SecurityFilterChain 분리 작업, 리팩터링
- Swagger 문서화
- .http 로 통합테스트 준비
정도인데, 특히 SecurityFilterChain을 리팩터링하면서 무한 디버깅의 늪에 빠지는 경험을 했다.
1. 시큐리티 개선 (feat. 공식문서)
https://docs.spring.io/spring-security/reference/servlet/architecture.html
그동안 구현에 급급했기에 내가 만든 클래스가 각각 어떤 역할을 하는지 100% 이해하지 못한 상태였다. 낮에 마신 커피 때문에 잠을 설치다가, 우연히 스프링 시큐리티 공식문서에 설명된 아키텍쳐 설명을 읽게 되었다. 읽고 난 후 현재 작성한 코드에 문제가 있음을 깨닫고 개선 작업을 시작했다. 개선한 주요 내용은 다음과 같다.
1) permitAll인 api는 jwt토큰을 통해 인증을 발급하는 필터를 탈 필요가 있을까?
SecurityFilterChain은 여러 개 일수있고, 각 SecurityFilterChain은 독립적이다. FilterChainProxy에 의해 하나의 요청이 하나의 SecurityFilterChain에 할당되도록 한다. 기존에는 하나의 SecurityFilterChain을 사용해서 모든 요청이 하나의 SecurityFilterChain을 사용했지만, 개선 후 용도에 따라 SecurityFilterChain을 분리함으로써 각각 요청에 필요한 필터를 알맞게 넣어줄 수 있었다.
2) jwt토큰을 통해 인증을 발급하는 필터는 어느 순서에 위치해야 할까?
ExceptionTranslationFilter에 의해 예외 처리가 되어야 하므로 커스텀 필터를 ExceptionTranslationFilter 뒤에 위치시켜야 한다. Authentication에 실패하여 AuthExcepiton이 나면 AuthenticationEntryPoint에 의해 처리되고, Access Denied 일 경우에는 AccessDeniedHandler 에 의해 처리된다. 따라서 jwt 토큰 유효 검증에 실패하면 인증 단계에서 실패한 것이므로 AuthException으로 내던지도록 수정하였다.
3) 커스텀 필터가 중복 등록되는 문제
SecurityFilterChain을 분리했음에도 permitAll로 설정한 엔드포인트에 커스텀 필터가 적용되는 문제가 있었다. 이유를 알아보니 커스텀 필터에 @Component 를 달면 이 필터가 서블릿 컨테이너에 의해 한번, Spring Security에 의해 한번, 이렇게 총 두번 등록되어 중복 호출되고 있었던 것이다. 따라서 FilterRegistrationBean 에서 enable 설정을 false로 설정해주면 중복 호출을 방지할 수 있다.
2. 동료와 적극적으로 소통하기
이번 프로젝트에서는 한 도메인당 2명씩 짝지어 작업을 진행했다. 팀 규칙 중 하나가 팀원이 pull request를 요청하면 다른 팀원의 Approve가 있어야만 merge가 가능하다는 것이었는데, 나와 내 파트너는 서로 적극적으로 코드리뷰를 해주었고 pr 메시지도 친절하게 작성해주어 리뷰하기가 매우 편했다.
또한 매일 아침 간단하게 오늘 해야 할 일에 대해 브리핑하면서 막힌 부분은 어디인지, 어떤 점을 고민하고 있는지를 서로 공유하고 노션에 기록했다. 노션을 거의 연습장 수준으로 써놔서 정돈되지는 않았지만, 그동안 고민한 포인트들이 잘 기록되어 있고 나도 파트너도 깜빡 잊는 일 없이 작업을 진행할 수 있었다.
각자 책임을 맡은 부분에서 최선을 다하되, 막히는 부분이 있을 때 의견을 구하고 다양한 방면으로 생각해 볼 수 있어서 유익했다. 이번 프로젝트를 함께 해준 파트너 D에게 정말 고맙고, 회사 동료로 D같은 사람과 만나면 정말 행복할 것 같다는 생각을 했다.
마무리
처음에 회원 도메인을 맡게 되었을 때는 시큐리티에 대한 막연한 두려움 때문에 썩 달갑지만은 않았다. 하지만 멀티 모듈 상황에서 수문장(..!) 역할을 하는 시큐리티를 사용하여 개발하면서 막연한 두려움을 없애고, 제대로 이해하려 노력하다 보니 재밌는 포인트들이 많았다.
방학 때 재충전하는 시간을 갖고, 다음주부터 다시 달려보자!
'데브코스' 카테고리의 다른 글
빙터파크 팀 프로젝트 회고 (0) | 2024.01.18 |
---|---|
Spring Security 멀티 필터체인으로 철벽 보안 구성하기 - multiple SecurityFilterChain, multiple Spring Security Configurations (0) | 2024.01.17 |
[데브코스] 1월 1주차 회고 (1) | 2024.01.07 |
HTTP 완벽 가이드 스터디 회고 (1) | 2023.12.28 |
[데브코스] 자바 도서관리 미션을 하면서 배운 것들 (1) | 2023.11.23 |