Today I Learn ✍🏼
- 오늘 하루 가장 인상 깊었던 배움에는 뭐가 있었지?
- 그 배움까지 다가가는데 어떤 어려움이 있었지?
- 그 어려움을 해결하기 위한 나의 시도들은 무엇이 있었지?
- 그 과정에서 나는 무엇을 깨달았고, 어떤 감정/생각이 들었었지?
- 이 상태에서 이후 더 나은 내가 되려면 무엇을 보완하지?
쿠팡 프로젝트 시작 1일차이다.
MSA로 설계를 하려는데
이전에 했던 배달민족 프로젝트에서 멘토님이 해주신 코멘트로 인해
설계에서 고민 중이다.
Gateway서버와 Auth 서버의 역할
1. **역할 분리**: Gateway는 인증과 관련된 로직을 모두 제거하고, 인증은 오직 Auth 서버로의 API 호출을 통해 처리해야 합니다. 이렇게 함으로써 Gateway는 트래픽 관리와 요청 분배 역할에 집중하고, 인증 및 권한 부여는 Auth 서버에서 전담하도록 구조를 명확히 할 수 있습니다.
2. **Security Filter 활용**: 인증 요청을 Auth 서버로 전달하는 로직은 Gateway의 Security Filter에서 처리하는 것이 가장 적절합니다. 이를 통해 Gateway는 단순히 요청을 필터링하고 인증 로직을 Auth 서버로 위임함으로써 역할을 분리할 수 있습니다.
3. **통신 비용 최적화**: 로컬에서 수행되던 인증을 외부 통신(Auth 서버)으로 전환하는 것은 통신 비용이 증가할 수 있는 부담이 있습니다. 이 경우 Redis나 로컬 캐시를 활용해 통신 비용을 줄이고 성능을 최적화할 수 있습니다. 예를 들어, 인증된 토큰 정보를 Redis에 저장해 반복적인 인증 요청 시 빠르게 처리할 수 있도록 합니다.
4. **캐시 사용 기준 명확화**: Redis와 로컬 캐시를 언제 사용할지에 대한 명확한 기준을 세우는 것이 중요합니다. 일반적으로 Redis는 여러 인스턴스 간의 일관된 캐시가 필요한 경우나, 세션 관리, 전체 로그아웃 등의 기능을 지원할 때 적합합니다. 반면, 로컬 캐시는 인스턴스 내부에서만 유효한 짧은 주기의 데이터를 캐싱할 때 효과적입니다. 각 캐시 사용의 장단점을 고려하여 상황에 맞게 사용해야 합니다.
==> 게이트웨이는 그럼 라우팅만 한다
인증, 인가, jwt 생성, jwt 검증도 인증서버가 한다고 치자.
어쩃든 user db는 호출해야함.
그러면 유저 관련 CRUD는 인증서버에서 다 다루는게 맞는걸로 현재 임시 결정.
서로 다른 서버가 하나의 데이터베이스를 사용하는 것은 권장하지 않는다.
Auth 서버와 Mono 서버가 하나의 데이터베이스를 공유하는 것은 여러 잠재적인 위험이 있을 수 있습니다.
1. **데이터 변경 시 알림 부족**: Mono 서버에서 데이터베이스 마이그레이션이나 스키마 변경이 있을 경우, Auth 서버는 이러한 변경 사항을 즉시 알 수 없습니다. 이로 인해 데이터 불일치나 예상치 못한 오류가 발생할 수 있으며, Auth 서버가 적절히 대응하지 못해 서비스 중단이나 보안상의 문제가 생길 위험이 있습니다.
2. **데이터베이스 커넥션 풀 관리 어려움**: 두 서버가 동일한 데이터베이스를 사용하면, 커넥션 풀 관리가 매우 복잡해집니다. 특히 한 서버(Mono 서버)의 레플리카가 갑자기 증가하면, 데이터베이스 커넥션 풀이 한계에 도달할 수 있고, 이로 인해 다른 서버(Auth 서버)의 성능에도 영향을 미칠 수 있습니다. 결과적으로 데이터베이스 커넥션이 부족해지고, 전체 시스템 성능이 저하되거나 서비스 장애가 발생할 수 있습니다.
3. **성능 저하와 스케일링 문제**: Auth 서버와 Mono 서버가 같은 데이터베이스를 공유하면, 하나의 서버에서 발생하는 과부하가 다른 서버의 성능에도 영향을 줄 수 있습니다. 예를 들어, Mono 서버의 트래픽이 급증하여 데이터베이스에 부하가 걸리면, Auth 서버의 인증 요청 처리 속도가 느려지고 사용자 경험이 악화될 수 있습니다. 이러한 구조에서는 각 서버의 독립적인 스케일링이 어려워, 전체 시스템의 확장성과 성능 관리가 복잡해집니다.
4. **보안 취약점 증가**: 동일한 데이터베이스를 공유할 경우, 보안적인 취약점도 증가할 수 있습니다. Mono 서버의 취약점이 악용되면 데이터베이스가 손상될 수 있고, 이는 곧 Auth 서버의 보안에도 큰 영향을 미칩니다. 특히 인증 관련 민감한 데이터가 Mono 서버와 공유되는 구조는 보안 사고 시 피해 범위를 더욱 확대할 수 있습니다. 데이터 접근을 제한하거나 데이터베이스를 분리하여 민감 정보를 보호하는 것이 필요합니다.
이러한 위험 요소들을 고려할 때, 각 서버가 독립적인 데이터베이스를 사용하거나, API를 통해 간접적으로 데이터를 접근하도록 구조를 개선하는 것이 바람직합니다. 이를 통해 시스템의 안정성과 보안을 높일 수 있습니다.
아니 그러면
다른 서버로 요청 던질때
애초에 권한별로 할수있는지 없는지 하는건 어디서 해야하는거지?
게이트웨이? 인증서버? 각자의 서버?
아니 그럼 jwt 토큰을 각 서버별로 검증해야한다는 소리인데 이게 맞나?????????????
내일 튜터님 찾아뵈야할듯
'기술 블로그 (Tech Blog) > Project-coopang' 카테고리의 다른 글
Grafana (0) | 2024.09.14 |
---|---|
prometheus (0) | 2024.09.14 |
docker-compose.yml 네트워크 만든 후 실행 방법 (0) | 2024.09.13 |
멀티모듈 프로젝트 설정 (0) | 2024.09.12 |
API 설계 원칙 (0) | 2024.08.20 |