pile·
백엔드·aws-architectureAWS Architecture·

AWS에서 Nakama 게임 서버에 Amazon Cognito 이중 토큰 인증 적용하기

AWS에서 Amazon Cognito 플레이어 인증과 Nakama 게임 서버 세션을 이중 토큰으로 통합하는 아키텍처를 다룬다. 각 토큰이 독립적 라이프사이클을 가지므로 게임플레이 중단 없이 인증 갱신이 가능하며, 4계층 라우팅(CloudFront→WAF→LB→ECS)과 Go 런타임 훅을 결합해 구현한다.

핵심 포인트
  • Cognito JWT의 sub 클레임을 Nakama 사용자 ID로 매핑해 두 시스템의 신원을 브리지하며, 훅은 클라이언트가 보낸 identity 문자열을 신뢰하지 않고 검증된 sub 클레임으로 덮어쓴다.
  • Go 훅에서 5단계 JWT 검증(형식→RS256 알고리즘→RSA 서명→만료→발급자/대상)을 순차 수행한다.
  • JWKS 캐시에 1시간 TTL과 thundering herd 방지(30초 재조회 가드)를 적용해 만료 시 다수 고루틴이 Cognito에 동시 접근하는 것을 막는다.
  • ALB는 기본-거부 모델로, 명시적 경로(/healthcheck, /v2/account/authenticate/*, /v2/*, /v1/*)만 Nakama로 전달하고 나머지는 403 반환한다.
  • NLB TCP idle timeout(350초)보다 짧은 10초 Nakama ping interval로 WebSocket 연결을 유지한다.
상세 정리
  • 아키텍처: CloudFront(단일 HTTPS 진입점)→WAF(에지 트래픽 필터링)→ALB(HTTP API)/NLB(WebSocket TCP passthrough)→ECS Fargate(Nakama 런타임).
  • 인증 흐름: 플레이어가 Cognito에 USER_SRP_AUTH 방식으로 인증(비밀번호가 클라이언트를 떠나지 않음) → JWT 수신 → Nakama POST /v2/account/authenticate/custom으로 JWT 전달 → Go 훅이 서명·만료·발급자·대상 검증 → sub 클레임을 Nakama 사용자 ID로 오버라이트 → Nakama 세션 토큰 반환.
  • JWKS 캐싱: TTL 1시간. 캐시 만료 시 여러 고루틴이 동시에 Cognito JWKS 엔드포인트를 호출하는 thundering herd를 30초 재조회 가드로 방지.
  • ALB 라우팅(기본-거부): Priority 1(헬스체크)/2(인증)/10(Nakama REST)/11(Nakama RPC)/Default(403). 명시되지 않은 엔드포인트는 미인증 접근 불가.
  • WebSocket 생명주기: NLB TCP idle timeout 350초(AWS 기본, 비설정) 이내에 10초 ping keepalive로 흐름 유지. 세션 토큰은 WebSocket 업그레이드 시 쿼리 파라미터로 검증.
  • 단일 소켓 정책: single_socket: true로 플레이어 재접속 시 이전 연결을 종료해 세션 중복 방지.
  • 보안 레이어: CloudFront가 모든 요청에 X-CloudFront-Secret 헤더 추가, ALB 리스너 규칙이 검증 후 라우팅. ALB 보안 그룹은 CloudFront 관리형 프리픽스 목록에서 오는 인바운드만 허용.
  • IaC: Terraform 6개 모듈(네트워크, 컴퓨팅, Auth, CDN, WAF, Ops)로 구성. `cd terraform && terraform init && make deploy` 명령으로 배포.
  • 프로덕션 권고: PostgreSQL 사이드카 대신 Aurora PostgreSQL 사용, CloudFront-ALB 간 TLS 재암호화, Cognito/Secrets Manager용 VPC 엔드포인트 추가로 NAT 게이트웨이 의존성 제거.
  • 범용성: 4계층 WebSocket 생명주기 모델은 Colyseus, Photon 등 NLB TCP passthrough 뒤에 있는 모든 실시간 서버에 적용 가능. JWT 검증은 OIDC 표준을 따르므로 Cognito 외 다른 OIDC 제공자와도 호환.
왜 읽나게임 백엔드에 JWT 기반 이중 인증을 도입하거나 Nakama/Colyseus 같은 실시간 서버에 OIDC 인증을 붙이려는 백엔드/게임 서버 엔지니어에게 직접적인 구현 가이드.
aws-architecture
AWS Architecture 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 백엔드·여기어때 (GC컴퍼니)여기어때 (GC컴퍼니)·

    트랜잭션 스크립트에서 숙소 메타 + 가격 계산 모듈로 — 전시 아키텍처 개선기 (2/3)

    여기어때 전시개발팀이 숙소 상세(PDP) API를 해부한 결과, 코드상으로는 DB 호출 3번처럼 보이던 요청이 실제로는 MongoDB $lookup 체인으로 컬렉션을 19회 접근하는 구조였다. 이 트랜잭션 스크립트 방식의 핵심 문제는 "aggregation이 I/O를 가린다"는 점으로, 독립적인 쿼리 10개가 단일 파이프라인에 직렬화되어 병렬화 기회를 잃고, 가격 때문에 거의 안 바뀌는 이미지까지 매 요청마다 읽어야 하는 읽기 증폭이 발생했다. V3에서는 "조회 시점 조립"을 "쓰기 시점 사전 조립"으로 전환하고, 화면별로 복제되던 가격 계산 로직을 goodsprice 단일 모듈로 수렴했다. 4개 API(PLP/PDP/RDP/ILP)의 반복 마이그레이션은 Claude Code skill로 절차를 고정하고 쉐도잉 + 동일성 검증으로 안전망을 마련하는 방식으로 진행됐다.

    #architecture#migration#caching+2