작업 내용 요약
새로운 팀원들과 다른 사람이 만든 프로젝트를 리팩토링하는 프로젝트를 진행하게 되었다. 실제 X대학교에 운영 중인 프로젝트를 리팩토링 하는 것으로 진행하였는데, 전체적인 도메인을 이해한 뒤 각자 파트를 나누어 작업 하기로 했다. 목표는 적극적인 코드리뷰와 테스트 코드작성이며, 저는 보안 성능 개선을 진행 한 뒤 User에 대한 리팩토링 작업 및 테스트 코드를 작성하게 되었다.
해당 도메인은 JWT 기반 인증 시스템을 사용하고 있었으며, 인증이 완료되면 body 값을 통해 accessToken과 refreshToken을 응답하는 방식이었다. 이렇게 전달된 토큰을 기반으로 프론트엔드 측 localStorage에 인증 상태를 관리하고 있었으며, 또한 서버 측의 재발급 절차에서 refreshToken에 대한 검증이 충분하지 않아 보안적으로 취약한 상태로 판단했다.
JWT가 탈취 되었을 때를 대비하는 것이 굉장히 중요하기 때문에 accessToken의 유효시간을 2시간 -> 10분 으로 단축시키고 refreshToken의 시간을 24시간 -> 7일로 연장 시킨 뒤 refreshToken을 제대로 검증하기 위해 DB에 저장하기로 했다. 해당 서비스에는 Redis를 사용하기 때문에 Redis에 저장하기로 했다.
JWT 방식을 일부 stateful 하게 가져가되 stateless한 상태를 최대한 유지하고 보안 성능 까지 가져가도록 설계했다. 물론 상황 마다 다르겠지만 사실상 프론트엔드에 관리 되고 있는 인증 정보를 서버 측에 가지고 와야되는건 당연할 수 있다. 덕분에 서버 측에서 확실한 검증과 토큰을 무효화 할 수 있게 되었다.
토큰 무효화를 진행 하기 위해서는 현재 body로 전달되고 있는 토큰을 헤더와 쿠키를 통해 전달한다. Authorization 헤더를 사용하여 accessToken 을 전달하고 httpOnly와 같은 보안 설정을한 쿠키를 통해 refreshToken을 전달한다.(https 환경에 서브도메인이 같다면 secure, SameSite 필요) Redis에 해당 토큰을 지우고 저장하고 검증하며, 프론트엔드의 쿠키를 서버에서 통제하며 보안 성능을 올렸다.
해당 작업을 완료 후 코드 리뷰를 받으며 PR을 진행했다..!
코드 리뷰를 경험하다.

" 헤더와 쿠키 형태로 토큰 응답을 주는 게 보안상 좋아 보인다고 생각합니다! 궁금한 부분이 있는데 쿠키로 받은 토큰값을 헤더에 추가해서 보낼 때, 브라우저 딴에서 셋팅한 쿠키와 클라이언트가 셋팅한 쿠키, 두개의 같은 리프레시 토큰이 서버로 요청 보내지는 것인가 궁금합니다."
" 토큰 관련 상수의 책임을 MemberController로 옮긴 이유가 궁금합니다! 읽다 보니 토큰 관련 상수가 Controller의 책임일까라는 의구심이 듭니다. 그래서 TokenProvider 혹은 토큰 관련 상수만 뽑은 객체를 통해 getter를 통해 가져올까? 라는 생각도 드는데 이러면 상수를 사용할 수 있는 범위가 확대된다는 생각에 어느 것이 나을까 고민이 돼요. 어떻게 생각하시나요??"
" refresh 토큰을 redis에서 보관을 하면서 검증을 한다면, stateful하지 않나요??"
" 위에서 return 구문을 사용해서 여기에는 else 를 사용하지 않아도 될 것 같습니다..!"
" 코드 가독성이 좋아졌습니다!"
" 수고하셨습니다! 상수 분리하니 가독성이 더 좋아진 것 같습니다! 👍👍"
코드 리뷰를 받으면서 내 생각이 정리되고, 칭찬도 받고, 좋은 의견도 들을 수 있어 정말 좋았다. 평소 개발 관련 잡담을 즐기는 사람이라면 코드 리뷰 문화를 정말 좋아할 것 같다. 내가 그런 사람인지라 상당히 재미있고 흥미롭게 느꼇다! 리뷰를 통해 코드를 다시 생각하고 수정하는 과정이 매우 뜻깊게 느껴졌다. 특히 항상 고민했던 테스트 코드 작성에 대해 서로의 스타일을 참고하고 의견을 공유할 수 있어서 큰 도움이 되었다. 과거에 포스트맨으로만 테스트하면서 개발하던 내가 테스트 코드 작성에 흥미를 갖게 된 것은 지금의 팀원들 덕분인것 같다. 정말 감사한 마음이다😆 최근에 작업했던 캡스톤 디자인 프로젝트에 테스트 코드가 없는데 이번 프로젝트가 끝나면 작성해볼까 한다.!
마지막으로 리뷰어 입장에서의 코드 리뷰도 중요하다고 생각하게 되었다. 나를 통해서 팀원이 프로젝트에 혹은 성장에 도움이 될 수 있도록 ! https://tech.kakao.com/posts/498 를 참고하면서 효과적인 코드리뷰를 남길 수 있는 리뷰어가 되도록 실습하려고 한다!
'develop' 카테고리의 다른 글
| 네이버 로그인 검수 승인받는 법 (0) | 2025.04.03 |
|---|---|
| Spring Security 권한 여러 개 (학생/강사 테이블 분리된 인증 서비스 구현) (0) | 2025.01.27 |
| Spring Batch 정리 (2) | 2024.10.01 |
| 교차 출처 리소스 공유 CORS 정리 (0) | 2024.09.30 |
| 언제 RDB 대신 MongoDB를 사용할까 (1) | 2024.09.26 |
