📘 web

인증 방식을 이야기할 때 가장 자주 나오는 질문 중 하나가 있습니다.

“세션이 더 좋은가요, JWT가 더 좋은가요?”

이 질문은 기술 선택처럼 보이지만, 실제로는 그렇지 않습니다.

실무에서는 “무엇이 더 최신인가”보다 상태를 어디에 둘 것인가, 인증을 누가 통제할 것인가, 서비스가 몇 개로 나뉘어 있는가가 더 중요합니다. 결국 세션과 JWT의 차이는 문법이 아니라 상태 관리 전략의 차이에 가깝습니다.

세션 기반 인증은 왜 아직도 유효한가

세션 기반 인증은 로그인 이후 인증 상태를 서버가 직접 들고 있는 방식입니다.

클라이언트는 세션 식별자만 전달하고, 실제 인증 정보와 권한 상태는 서버가 관리합니다.

이 방식의 장점은 단순합니다.

서버가 인증 상태를 직접 통제하기 쉽습니다. 강제 로그아웃, 권한 변경, 세션 만료 처리 같은 것도 비교적 직관적입니다. 무엇보다 브라우저 기반 웹 서비스에서는 구현과 운영이 단순한 편입니다.

특히 서버가 하나이거나, 서비스 경계가 복잡하지 않은 환경에서는 세션 방식이 꽤 강합니다.

실제로 이런 환경에서는 JWT보다 세션이 더 자연스러운 경우도 많습니다. 인증 상태를 굳이 토큰 안으로 밀어 넣어 외부로 내보낼 이유가 없기 때문입니다.

하지만 세션 방식은 서버가 여러 대로 늘어나는 순간 고려해야 할 것이 생깁니다.

각 서버가 각자 세션을 들고 있으면 요청이 다른 서버로 갔을 때 인증 상태가 이어지지 않습니다. 그래서 멀티 서버 환경에서는 세션 클러스터링, 외부 저장소, 혹은 sticky session 같은 보완이 필요합니다.

즉, 세션은 단일 서버나 단일 서비스에서는 단순하고 강력하지만,

서비스가 분산되기 시작하면 상태 공유 비용이 붙는 구조입니다.

JWT는 왜 많이 쓰이게 되었는가

JWT는 인증 상태를 서버 세션 저장소에 두는 대신, 토큰 자체에 필요한 정보를 담아 검증하는 방식입니다.

즉, 인증 상태를 서버가 들고 있기보다 서버들이 공통 규칙으로 토큰을 검증하는 구조에 가깝습니다.

이 방식은 서비스가 여러 개로 나뉘고, API 중심 구조가 되면서 강점을 드러냅니다.

한 번 로그인해 토큰을 발급받으면, 같은 인증 체계를 공유하는 여러 서비스가 별도 세션 공유 없이 토큰만으로 인증을 처리할 수 있기 때문입니다.

이런 구조는 특히 아래 같은 환경에서 잘 맞습니다.

  • API 서버가 여러 개로 분리되어 있을 때
  • 모바일, 웹, 외부 시스템이 함께 붙을 때
  • 게이트웨이 뒤에 여러 애플리케이션이 있을 때
  • 인증을 한 번 하고 여러 서비스에 넘겨 써야 할 때

즉, JWT의 핵심 장점은 “최신 기술”이라서가 아니라,

분산된 서비스 환경에서 인증 상태를 전달 가능한 형태로 만들기 쉽다는 데 있습니다.

그렇다면 JWT가 무조건 더 나은가

여기서 많은 팀이 한 번 실수합니다.

세션보다 JWT가 더 현대적이고 더 확장 가능하니, 무조건 JWT로 가야 한다고 생각하는 겁니다.

그런데 JWT는 공짜가 아닙니다.

서버가 상태를 직접 들고 있지 않기 때문에, 반대로 다음 문제들이 생깁니다.

  • 강제 로그아웃은 어떻게 할 것인가
  • 권한이 바뀌었을 때 이미 발급된 토큰은 어떻게 할 것인가
  • 탈취된 토큰은 어떻게 무효화할 것인가
  • Access Token과 Refresh Token의 수명은 어떻게 나눌 것인가

즉, JWT는 세션 저장소 조회를 줄여주는 대신,

무효화와 통제의 복잡도를 애플리케이션 쪽으로 가져옵니다.

그래서 실무에서는 JWT를 도입하면서도 결국 Refresh Token 저장소를 두거나, 재발급 정책을 세밀하게 관리하거나, 토큰 블랙리스트 같은 구조를 다시 설계하게 됩니다. 이쯤 되면 “stateless라서 단순하다”는 말은 절반만 맞는 얘기가 됩니다.

실무에서는 어떻게 선택하는 것이 맞을까

실무에서는 보통 기술 자체보다 서비스 구조로 판단합니다.

단일 웹 애플리케이션이고 서버 수가 적으며,

권한 변경과 세션 통제가 중요하다면 세션 방식이 여전히 강합니다.

반대로 서비스가 API 중심으로 분리되어 있고,

여러 애플리케이션이나 외부 클라이언트가 같은 인증 체계를 공유해야 한다면 JWT가 잘 맞습니다.

즉, 기준은 간단합니다.

  • 인증 상태를 서버가 직접 통제해야 하는가
  • 인증 정보를 여러 서비스에 전달해야 하는가
  • 서버 수평 확장이 많은가
  • 권한 변경과 강제 로그아웃이 자주 필요한가

이 질문에 대한 답으로 세션과 JWT를 선택해야 합니다.

실무에서는 “세션 vs JWT”가 아니라,

서버 중심 상태 관리 vs 전달 가능한 인증 상태 관리의 선택에 가깝습니다.

내 기준으로 정리하면

저는 이 문제를 보통 이렇게 정리합니다.

세션은 서버가 하나이거나, 인증 통제가 더 중요할 때 강합니다.

JWT는 여러 서비스가 인증을 공유해야 할 때 강합니다.

즉, 세션은 통제 쪽에 강하고,

JWT는 확장과 전달 쪽에 강합니다.

둘 중 하나가 절대적으로 우월한 게 아니라,

시스템이 어디서 복잡도를 감수할지에 따라 적합성이 갈립니다.

기술 선택은 늘 그렇습니다.

좋은 방식이 따로 있는 것이 아니라, 복잡도를 어느 쪽으로 보낼 것인지가 있을 뿐입니다.

태그:

카테고리:

업데이트: