이번 프로젝트를 통해 세션, JWT, 쿠키 등 다양한 방식으로 인증 및 인가를 공부하고 적용해보는 시간을 가졌다. 결론적으로, 보안과 UX는 트레이드 오프 관계에 있다. 보안성이 높아지면 사용자 경험은 그만큼 떨어지게 되고, 사용자 경험을 높이려면 어느 정도 보안에 타협이 필요하다. 이번 글에서 공부한 내용을 정리하고 프로젝트를 마무리하고자 한다.
스프링 시큐리티의 폼 로그인은 기본적으로 세션 기반 인증이다. 사용자가 로그인하면 시큐리티 컨텍스트에 정보가 올라가며, 이를 통해 권한을 부여받는다.
JWT (Json Web Token)는 서버가 클라이언트에게 인증 정보를 전달할 때 사용되는 토큰으로, 클라이언트는 이를 HTTP 헤더에 포함하여 서버에 요청을 보낸다. 서버는 토큰의 유효성을 검사한 후 요청을 처리한다.
Spring Security는 애플리케이션의 보안을 담당하는 필터 기반 프레임워크로, 모든 HTTP 요청은 필터 체인을 통과하여 사용자 인증과 권한 부여가 이루어진다.
이번 프로젝트에서는 JavaMailSender를 사용해 이메일로 토큰이 담긴 URI를 생성하고, 이메일 링크를 통해 토큰으로 JWT를 발급하여 Access Token과 Refresh Token을 부여했다. OAuth를 통해 인증한 사용자 역시 자사의 Access Token과 Refresh Token을 부여하여 책임 소재를 분명하게 했다.
JWT는 쿠키에 담겨있고, Spring Security는 세션 기반으로 작동하므로, 이를 통합하기 위해 JWT Request Filter를 구현하여 쿠키에서 JWT를 가져오는 로직을 생성했다. Refresh Token은 DB 부하를 고려하여 쿠키에 저장하였으나, 이로 인해 탈취 위험이 있을 수 있음을 염두에 두었다.
이번 프로젝트를 통해 JWT, Spring Security, Cookie, Session 등 인증과 인가 방식의 동작 원리를 학습하였다. 리프레시 토큰을 효율적으로 관리하는 방법에 대한 추가 학습이 필요하다고 느꼈으며, 기회가 된다면 OAuth 사용자와 다른 인증 방식을 분기하여 결합도가 낮은 리팩토링을 진행할 예정이다.