SSR(서버 사이드 렌더링) 방식에서 사용자 인증하기

·2024년 11월 3일

Web

목록 보기
6/6
post-thumbnail

SSR(서버 사이드 렌더링) 방식에서 사용자 인증을 구현하는 방법에는 여러 가지가 있으며, 각 방식은 보안 수준, 사용자 경험, 구현 난이도에 따라 선택이 달라진다. 나는 이번에 SSR 방식을 처음 사용하면서, 인증 부분을 SPA(Single Page Application)에서 사용하던 방식 그대로 JWT를 통해 구현했다. 그러나 SSR에서 JWT를 사용하는 기존 방식(즉, access token을 localStorage에 저장하고 요청마다 Authorization 헤더에 넣어 보내는 방식)에는 몇 가지 문제가 있었다. 이를 해결하는 과정에서 SSR에 적합한 두 가지 인증 방식을 정리해보았다.

세션 기반 인증 (Session-based Authentication)

세션 기반 인증은 SSR 방식에서 가장 흔히 사용되는 인증 방식이다. 사용자가 로그인에 성공하면 서버는 고유한 세션 ID를 생성하여 세션 저장소(메모리, 데이터베이스, Redis 등)에 저장한다. 이후 이 세션 ID가 클라이언트의 쿠키에 저장되고, 이후 모든 요청에서 쿠키를 통해 서버에 전달되어 인증 상태가 유지된다.

  • 장점:
    • 서버에서 세션을 관리하기 때문에 보안성이 높고, SSR 방식과 자연스럽게 통합된다.
    • 클라이언트 측에서는 별도의 HTTP 헤더 설정이 불필요하여 코드가 간결해진다.
  • 단점:
    • 세션 저장소가 필요하므로 서버에 부하가 가중될 수 있다.
    • 서버 확장이 필요한 경우 세션 공유(예: Redis 또는 sticky session 설정)를 고려해야 한다.

Spring Security에서 기본적으로 제공하는 방식으로, SSR 환경에서 HTTP 세션을 통해 인증 상태를 관리하기에 적합하다.

쿠키 기반 토큰 인증은 클라이언트에 JWT(JSON Web Token) 또는 CSRF 보호 토큰을 쿠키로 저장하는 방식이다. SSR 환경에서 JWT를 이용한 인증을 구현할 때는 주로 다음과 같은 방법이 활용된다.

  • JWT: 사용자가 로그인하면 서버에서 JWT를 생성해 클라이언트에 전달하고, 이 토큰은 쿠키에 저장된다. 이후 요청마다 이 토큰이 쿠키를 통해 서버로 전달되며, 서버는 이를 검증하여 사용자를 인증한다.
  • CSRF 보호: JWT가 쿠키에 저장되는 경우, CSRF(Cross-Site Request Forgery) 공격에 취약할 수 있으므로 SameSite 설정이나 CSRF 토큰을 추가로 설정하여 보안을 강화해야 한다.
  • 장점:
    • 상태 비저장(stateless) 인증이 가능해 서버에 세션 데이터를 별도로 저장하지 않아도 된다.
    • 서버 간 확장이나 부하 분산이 용이하다.
  • 단점:
    • 클라이언트 측에 쿠키나 토큰이 저장되므로 추가적인 보안 설정이 필요하다.
    • JWT는 만료되기 전까지 유효하므로, 토큰이 유출될 경우 위험할 수 있다.

JWT의 상태 비저장 특성과 쿠키의 특성을 이용한 쿠키 기반 토큰 인증은 SPA에서 흔히 사용되지만, SSR 환경에서도 활용 가능하다. 다만, SSR에서는 클라이언트 측에서 인증 토큰을 처리하는 방식이 다소 복잡할 수 있다.

내가 선택한 방법 : JWT를 이용한 쿠키 기반 토큰 인증

나는 이미 JWT를 사용하는 인증 로직을 완성해둔 상태였기 때문에, 기존 코드를 최소한으로 변경하면서 SSR 방식에 맞게 인증을 구현할 방법이 필요했다. 이에 따라 2번의 쿠키 기반 토큰 인증 방식을 적용하기로 결정하였다.

구체적인 변경 사항은 다음과 같다:

  • 로그인 로직 수정: 로그인 시 서버가 JWT를 생성하고, 이를 클라이언트의 쿠키에 저장하도록 변경하였다.
  • 토큰 가져오는 방식 수정: 기존에는 Authorization 헤더에서 토큰을 가져왔으나, 이제는 쿠키에서 토큰을 가져오도록 수정하였다.

이처럼 쿠키에 JWT를 저장하였기 때문에 개발자가 직접 요청마다 토큰을 추가할 필요 없이 서버와의 통신이 가능해졌으며, 전체적인 코드 수정 범위도 최소화할 수 있었다. SSR 환경에서 기존의 JWT 기반 인증 로직을 유지하면서도 보안성과 사용자 편의성을 고려한 쿠키 기반 토큰 인증을 효과적으로 적용할 수 있었다.

profile
개발블로그👩🏻‍💻

1개의 댓글

comment-user-thumbnail
2024년 11월 4일

쿠키가 먹고 싶어지는 글이에요

답글 달기