SSR(서버 사이드 렌더링) 방식에서 사용자 인증을 구현하는 방법에는 여러 가지가 있으며, 각 방식은 보안 수준, 사용자 경험, 구현 난이도에 따라 선택이 달라진다. 나는 이번에 SSR 방식을 처음 사용하면서, 인증 부분을 SPA(Single Page Application)에서 사용하던 방식 그대로 JWT를 통해 구현했다. 그러나 SSR에서 JWT를 사용하는 기존 방식(즉, access token을 localStorage에 저장하고 요청마다 Authorization 헤더에 넣어 보내는 방식)에는 몇 가지 문제가 있었다. 이를 해결하는 과정에서 SSR에 적합한 두 가지 인증 방식을 정리해보았다.
세션 기반 인증은 SSR 방식에서 가장 흔히 사용되는 인증 방식이다. 사용자가 로그인에 성공하면 서버는 고유한 세션 ID를 생성하여 세션 저장소(메모리, 데이터베이스, Redis 등)에 저장한다. 이후 이 세션 ID가 클라이언트의 쿠키에 저장되고, 이후 모든 요청에서 쿠키를 통해 서버에 전달되어 인증 상태가 유지된다.
Spring Security에서 기본적으로 제공하는 방식으로, SSR 환경에서 HTTP 세션을 통해 인증 상태를 관리하기에 적합하다.
쿠키 기반 토큰 인증은 클라이언트에 JWT(JSON Web Token) 또는 CSRF 보호 토큰을 쿠키로 저장하는 방식이다. SSR 환경에서 JWT를 이용한 인증을 구현할 때는 주로 다음과 같은 방법이 활용된다.
JWT의 상태 비저장 특성과 쿠키의 특성을 이용한 쿠키 기반 토큰 인증은 SPA에서 흔히 사용되지만, SSR 환경에서도 활용 가능하다. 다만, SSR에서는 클라이언트 측에서 인증 토큰을 처리하는 방식이 다소 복잡할 수 있다.
나는 이미 JWT를 사용하는 인증 로직을 완성해둔 상태였기 때문에, 기존 코드를 최소한으로 변경하면서 SSR 방식에 맞게 인증을 구현할 방법이 필요했다. 이에 따라 2번의 쿠키 기반 토큰 인증 방식을 적용하기로 결정하였다.
구체적인 변경 사항은 다음과 같다:
Authorization 헤더에서 토큰을 가져왔으나, 이제는 쿠키에서 토큰을 가져오도록 수정하였다.이처럼 쿠키에 JWT를 저장하였기 때문에 개발자가 직접 요청마다 토큰을 추가할 필요 없이 서버와의 통신이 가능해졌으며, 전체적인 코드 수정 범위도 최소화할 수 있었다. SSR 환경에서 기존의 JWT 기반 인증 로직을 유지하면서도 보안성과 사용자 편의성을 고려한 쿠키 기반 토큰 인증을 효과적으로 적용할 수 있었다.
쿠키가 먹고 싶어지는 글이에요