로그인 기능 구현방법 중에 session,token방식의 각각의 장단점을 알아보고 어떤 방식으로 구현하는 것이 유리한 방법인지 알아보겠습니다.
세션 기반 인증
세션은 로그인에 성공한 유저가 서비스를 사용하는 동안 저장하고 있는 유저 정보입니다. 서버는 세션을 생성하고 나서 세션을 데이터베이스에 저장하고, 이후 사용자의 요청에 포함된 세션 정보가 세선 DB에 저장되어 있는지 확인합니다. 브라우저에는 데이터를 저장할 수 있는 공간이 있습니다. 현재 열려 있는 브라우저를 닫거나 새로운 탭 또는 창을 열면 데이터가 삭제되는 세션 저장소와 창을 닫아도 데이터가 남아 있는 로컬 저장소, 그리고 간단한 데이터를 저장할 수 있는 쿠키가 있습니다.
세션 방식의 단점은 악의적인 공격자가 브라우저에 저장된 데이터를 탈취할 수 있다는 것입니다. 비록 세션을 알 수 없는 문자열로 만들었다고 해도, HTTP는 보안에 취약하기 때문에 중간에 전달되는 데이터 역시 가로챌 수 있습니다. 이렇게 탈취된 세션을 이용하면 마치 해당 사용자인 것처럼 서버에 접근할 수 있게됩니다.
세션은 서버의 저장소에 저장되고 빠른 응답을 위해 메모리에 상주시키는 경우가 많습니다. 이로 인해 서비스에 사용자가 몰렸을 경우 요청마다 세션을 확인해야 하므로 DB에 많은 부하를 일으키게 되고 메모리 부족으로 서비스 장애가 발생할 수 있습니다.
또한 서비스가 여러 도메인으로 나누어져 있는 경우 CORS 문제로 인해 도메인 간 세션을 공유하도록 하기 위한 처리가 번거롭습니다.
토큰 기반 인증
세션이 사용자 인증 정보를 서버에 저장하는 방식인 반면, 토큰은 사용자가 로그인했을 때 서버에서 토큰을 생성해서 전달하고 따로 저장소에 저장하지 않는 방식입니다. 로그인 이후 요청에 대해 클라이언트가 전달한 토큰 검증만 수행합니다. 이렇게 하기 위해서는 당연히 특정한 검증 방식이 필요한데, JWT를 많이 사용합니다.
토큰 기반 인증을 이용하면 세션과 같이 상태를 관리할 필요가 없어 어느 도메인의 서비스로 보내더라도 같은 인증을 수행할 수 있게 됩니다. 이를 확장하면 메타, 구글 계정으로 다른 서비스에 로그인을 할 수 있는 Oauth를 구현할 수 있습니다. 또한 토큰 기반 인증 방식은 세션 저장소가 서버에 필요하지 않기 때문에 세션 기반 방식에서 발생하는 문제가 줄어듭니다.
위의 장점과 더불어 대규오 애플리케이션에서 토큰방식을 사용하는 이유입니다.
- 상태 비저장 특성: 토큰은 상태 비저장입니다. 즉, 서버에 대한 각 요청에는 인증 및 권한 부여에 필요한 모든 정보가 포함되어 있습니다. 이러한 무상태는 여러 서버가 요청을 처리하는 분산 및 확장 가능한 시스템에서 매우 중요합니다. 서버가 세션 상태를 유지할 필요가 없으므로 더 많은 서버를 추가하여 수평적으로 확장하기가 더 쉽습니다.
- 마이크로서비스 아키텍처: 다양한 서비스가 애플리케이션의 다양한 측면을 처리하는 마이크로서비스 아키텍처에서 토큰은 서비스가 사용자 ID 및 권한을 확인하는 표준화된 방법을 제공합니다. 각 마이크로서비스는 중앙 집중식 세션 저장소에 의존하지 않고 토큰을 독립적으로 검증할 수 있어 분산화와 확장성을 촉진합니다.
- 교차 도메인 인증: 토큰은 교차 도메인 인증을 용이하게 하여 사용자가 한 번만 인증하면 여러 서비스나 애플리케이션에 원활하게 액세스할 수 있습니다. 이는 시스템이나 관련 애플리케이션의 다양한 부분이 다양한 도메인이나 하위 도메인에 배포되는 시나리오에서 특히 유용합니다.
- 데이터베이스 부하 감소: 기존 세션 기반 인증에는 세션 정보를 중앙 데이터베이스에 저장하는 경우가 많으며, 이로 인해 사용자 기반이 늘어남에 따라 잠재적인 병목 현상이 발생할 수 있습니다. 토큰을 사용하면 사용자 정보와 권한이 토큰 자체에 포함되므로 세션 유효성 검사를 위해 데이터베이스를 자주 쿼리해야 하는 필요성이 줄어듭니다.
- 강화된 보안: 토큰은 디지털 서명을 전달하거나 암호화되도록 설계하여 변조 및 도청에 대한 보안 수준을 제공할 수 있습니다. 이는 요청이 신뢰할 수 없는 네트워크를 통과할 수 있는 분산 환경에서 매우 중요합니다. 또한 토큰의 만료 시간이 짧아 토큰 도난과 관련된 위험을 최소화할 수 있습니다.
- 모바일 및 단일 페이지 애플리케이션(SPA): 토큰 기반 인증은 클라이언트-서버 상호 작용의 특성으로 인해 서버 측 세션을 유지하는 것이 어려울 수 있는 모바일 앱 및 SPA에 적합합니다. 토큰은 클라이언트 측에 안전하게 저장될 수 있으므로 이러한 시나리오에서 인증 구현이 단순화됩니다.
- 표준화 및 호환성: 특히 JWT(JSON 웹 토큰)를 사용하는 토큰 기반 인증은 광범위한 업계 지원을 받는 표준화된 접근 방식입니다. 다양한 프로그래밍 언어 및 플랫폼과 잘 작동하여 호환성과 통합 용이성에 기여합니다.
- 유연성 및 인증 제어: 토큰은 추가 클레임과 사용자 역할을 전달할 수 있으므로 인증에 대한 세부적인 제어가 가능합니다. 이러한 유연성은 액세스 권한 수준이 다양한 복잡한 애플리케이션에 유용합니다.
지금 계획하고자 하는 프로젝트는 전국 단위로 활성화 되어있는 애플리케이션이라고 가정을하고 프로젝트를 진행합니다. 이러한 조건 속에서는 JWT토큰 방식으로 로그인을 구현하면 분산 아키텍처에 유리합니다.
'[Project] Petogether' 카테고리의 다른 글
CQRS를 이용한 관심사 분리 (0) | 2024.05.20 |
---|---|
클린 아키텍처 적용 (0) | 2024.05.20 |