![[JS] 12. 쿠키&세션 인증의 한계](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255BJS%255D%252012.%2520%25EC%25BF%25A0%25ED%2582%25A4%2526%25EC%2584%25B8%25EC%2585%2598%2520%25EC%259D%25B8%25EC%25A6%259D%25EC%259D%2598%2520%25ED%2595%259C%25EA%25B3%2584%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3Djjack1&w=2048&q=75)

🚀 서버 확장과 인증 문제 해결: 개발자의 접근 방식
서비스가 성장하면서 사용자 수가 증가하고, 이에 따라 서버의 확장이 필요해졌다. 개발자로서 우리는 이러한 변화에 대비하여 서버 확장 및 인증 방식을 개선해야 한다.
🔹 1. 서버 확장의 필요성
📌 문제 발생: 사용자가 증가하면서 기존 단일 서버의 처리 용량이 한계에 도달했다.
🔍 문제 분석
request
객체는 풀링(pooling)되어 재사용되며, 서버의 성능에 따라 동시 접속 가능 수가 결정된다.
- 동시 접속자 수가 증가하면, 기존 서버의 리소스가 부족해지고 응답 속도가 느려진다.
✅ 해결 방법:
- 동일한 서버를 추가하여 부하를 분산.
- 설정을 번거롭게 수정하지 않기 위해 RAID 방식으로 기존 서버를 복제하여 배포.
- 결과적으로 여러 서버를 운영하며 더 많은 요청을 처리할 수 있도록 개선.
🔹 2. 부하 분산을 위한 로드 밸런서 도입
📌 문제 발생: 다중 서버 환경에서 사용자 요청을 특정 서버에 집중시키면 부하가 한쪽으로 쏠리는 문제가 발생.
🔍 문제 분석
- 특정 서버에만 요청이 집중되면 성능 저하 및 장애 가능성이 커진다.
- 클라이언트의 요청을 균등하게 분산할 필요가 있다.
✅ 해결 방법:
- L4 로드 밸런서를 도입하여 트래픽을 적절히 배분.
- 각 서버의 상태를 지속적으로 모니터링하여, 부하가 적은 서버로 트래픽을 전달.
- 이를 통해 특정 서버에 과부하가 걸리는 것을 방지하고, 전체 시스템의 안정성을 향상.
🔹 3. 세션 기반 인증의 문제점 ⚠️
📌 문제 발생: 서버가 여러 대가 되면서 기존의 쿠키 & 세션 인증 방식이 정상적으로 작동하지 않음.
🔍 문제 분석
- 사용자가 로그인하면, 해당 서버에 세션이 저장됨.
- 이후 요청이 다른 서버로 전달될 경우, 해당 서버에는 로그인 정보가 없어 인증 실패.
- 다중 서버 환경에서는 세션 동기화가 필요하지만, 이는 성능 저하 및 관리 복잡성을 초래.
🚨 결과:
- 동일한 서비스 내에서도 사용자 경험이 불안정해지고, 인증 관련 오류가 발생.
✅ 기존 해결책:
- 세션 클러스터링: 모든 서버가 공유할 수 있는 중앙 세션 저장소(Redis, DB 등)를 활용.
- Sticky Session: 동일한 사용자의 요청을 항상 같은 서버로 전달하도록 설정.
❌ 하지만, 이러한 방식은 추가적인 인프라 비용과 복잡성을 초래할 수 있음.
🔹 4. JWT(Json Web Token) 기반 인증 방식으로 전환 🔑
📌 새로운 해결 방법: 기존 세션 기반 인증 방식 대신, JWT(Json Web Token) 인증 방식 도입.
🔍 JWT 방식의 작동 원리
- 사용자가 로그인하면, 서버가 유저 정보를 암호화하여 서명된 JWT 토큰을 발급.
- 사용자는 이후 요청 시 JWT를 포함하여 전송, 서버는 이를 검증하여 인증 수행.
🔐 암호화 방식:
- 대칭키 암호화: 하나의 비밀키를 사용하여 암호화 및 복호화.
- 비대칭키 암호화: 공개키와 개인키를 활용하여 서명 및 검증.
✅ JWT의 장점:
- 세션 저장소 불필요: 서버 간 인증 정보를 공유할 필요 없이, 각 요청에 포함된 JWT로 인증 가능.
- 확장성 우수: 서버를 추가하거나 변경해도 JWT를 통해 인증을 유지할 수 있음.
- 보안성 강화: 토큰에 서명이 포함되어 있어 변조 여부를 쉽게 검증 가능.
▶️ JWT를 활용하면, 다중 서버 환경에서도 로그인 상태를 유지하며 안정적인 인증이 가능.
🔹 5. 쿠키 & 세션을 활용한 해결 방법
📌 쿠키 & 세션 방식도 다중 서버 환경에서 사용할 수 있음.
✅ 가능한 해결책:
- Sticky Session (세션 고정화):
- 로드 밸런서가 특정 사용자의 요청을 항상 동일한 서버로 보내도록 설정.
- 세션 데이터가 분산되지 않아 기존 방식 그대로 사용 가능.
- 하지만, 특정 서버에 부하가 집중될 가능성이 있음.
- 세션 공유 (Session Replication):
- Redis, Memcached 등 외부 저장소를 이용하여 세션을 여러 서버에서 공유.
- 서버가 다수라도 세션 정보를 모든 서버에서 접근 가능.
- 하지만, 추가적인 인프라 비용과 네트워크 오버헤드가 발생할 수 있음.
- 데이터베이스 기반 세션 저장:
- 세션 정보를 중앙 데이터베이스에 저장하고, 모든 서버에서 참조 가능하도록 설정.
- 다중 서버 환경에서 안정적인 세션 공유 가능.
- 하지만, DB 부하가 증가할 수 있음.
✅ 결론:
- 세션 기반 인증을 유지하면서 다중 서버 환경을 지원하려면 Sticky Session 또는 세션 공유 방식(Redis 등)을 도입하면 가능.
- 하지만 확장성과 관리 효율성을 고려하면 JWT 방식이 보다 효과적.
🔹 6. 결과 및 기대 효과 🎉
✅ 결과:
- 로드 밸런서를 통한 부하 분산으로 서버 확장 효과 극대화.
- JWT 기반 인증을 통해 서버 간 인증 정보 동기화 문제 해결.
- 또는 세션 공유 방식(Redis, DB 저장 등)을 도입하여 기존 세션 기반 인증 유지 가능.
- 전체적인 서비스 안정성과 확장성이 향상됨.
💡 결론:
- 다중 서버 환경에서는 세션 기반 인증과 JWT 기반 인증 모두 적용 가능, 단 각 방식의 장단점을 고려해야 함.
- 확장성과 유지보수성을 고려하면 JWT가 유리, 하지만 기존 인프라를 유지하면서 세션 기반 인증을 활용하는 방법도 존재.
- 이를 통해 보다 안정적인 서비스 운영이 가능.
내가 작성한 정리글
서버는 request 객체를 pooling해서 가지고 있는다 (미리 만들어 놓고 재사용)
서버의 하드웨어 사양에 따라 pooling해서 가지고 있는 request객체의 수가 다르다
이 request의 수가 서버의 동시 접속자 처리량이다
내 서버의 접속자 처리량을 늘리기 위해 서버를 1개 더 추가한다
이 때 서버의 설정을 다시 만지기 힘들기 때문에 그냥 서버를 복제한다(레이드 RAID)
이제 서버가 2개이기 때문에 앞 단에 진입 포인트를 할 장치가 필요하다(L4)
이제 이 장치가 요청을 받으면 서버의 사용량을 비교해 요청을 나눠 준다
이렇게 서버가 2개로 나눠진 상태에서 쿠키&세션 인증의 문제가 발생한다
A유저는 B1서버에 로그인을 하였다
A유저는 사용자 정보 페이지를 요청한다
이 요청이 B2서버로 간다
B2서버에는 A유저에 대한 정보가 세션에 없다
A유저는 로그인을 했지만 응답으로 에러가 날라온다
서버가 여러 개가 있다면 인증 정보를 공유하기 힘들기 때문에 쿠키&세션 인증으로는 해결하기 힘들다
이때 사용자의 정보를 암호화 서명하는 방식이 나타났다
대칭키로 암호화 해도 되고
비대칭키로 암호화 해도 된다
이제 A유저는 암호화된 데이터를 들고 다니면서 인증을 하면 된다
GPT가 정리한 글 1
서버 확장과 인증 문제 해결 과정
- Request 객체 풀링
- 서버는
request
객체를 미리 생성하여 풀링(pooling)해두고 재사용한다. - 서버의 하드웨어 사양에 따라 풀링할 수 있는
request
객체의 개수가 다르다. - 즉, 서버가 한 번에 처리할 수 있는 동시 접속자 수는
request
객체의 수와 밀접한 관계가 있다.
- 서버 확장 (스케일 아웃)
- 서버의 접속자 처리량을 늘리기 위해 동일한 서버를 하나 더 추가한다.
- 서버 설정을 다시 조정하기 어려우므로 기존 서버를 그대로 복제하는 방식(RAID)을 사용한다.
- 이제 서버가 2개가 되어 부하 분산이 필요하다.
- 로드 밸런싱 (L4 장치 도입)
- 클라이언트의 요청이 들어오는 진입 지점(Entry Point)이 필요하다.
- L4 로드 밸런서를 통해 두 개의 서버에 적절하게 요청을 분배한다.
- 로드 밸런서는 각 서버의 사용량을 비교하여 트래픽을 나눠준다.
- 쿠키 & 세션 인증 문제 발생
- A 유저가 B1 서버에 로그인하여 세션이 생성되었다.
- 이후 A 유저가 사용자 정보 페이지를 요청했으나, 이 요청이 B2 서버로 전달되었다.
- 그러나 B2 서버에는 A 유저의 세션 정보가 없어 인증 문제가 발생한다.
- 즉, 다중 서버 환경에서 쿠키 & 세션 방식의 인증이 원활하지 않다.
- 인증 정보 공유 문제 해결 (JWT 도입)
- 여러 서버에서 인증 정보를 공유하기 어려우므로, 사용자의 정보를 암호화하여 직접 관리하는 방식이 필요하다.
- 사용자의 정보를 암호화하고 서명하여 전달하는 방식을 사용한다.
- 암호화 방법은 두 가지가 있다:
- 대칭키 암호화: 서버 간 공유된 하나의 비밀키로 암호화 및 복호화 수행.
- 비대칭키 암호화: 공개키와 개인키를 활용하여 서명 및 검증 수행.
- 이제 A 유저는 암호화된 인증 데이터를 보유하고 있으며, 요청 시 이를 활용하여 인증을 진행한다.
Share article