fix: Internal API를 Rate Limiter에서 분리
All checks were successful
Server CI/CD / lint-and-build (push) Successful in 14s
Server CI/CD / deploy (push) Successful in 58s

데디케이트 서버 10개 인스턴스의 하트비트가 apiLimiter(IP당 60req/min)에
걸려 429 에러 발생. Internal API를 별도 그룹으로 분리하여 Rate Limit 제외.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-16 21:32:49 +09:00
parent 22e0652ee3
commit 5758c4784e

View File

@@ -100,8 +100,16 @@ func Register(
bossRaid.Post("/entry", brH.RequestEntryAuth) bossRaid.Post("/entry", brH.RequestEntryAuth)
bossRaid.Get("/my-entry-token", brH.GetMyEntryToken) bossRaid.Get("/my-entry-token", brH.GetMyEntryToken)
// Internal - Boss Raid (API key auth) // Player Profile (authenticated)
br := api.Group("/internal/bossraid", middleware.ServerAuth) p := api.Group("/player", middleware.Auth)
p.Get("/profile", playerH.GetProfile)
p.Put("/profile", playerH.UpdateProfile)
// ── Internal API (Rate Limit 제외, API Key 인증만) ──────────────
internalApi := app.Group("/api/internal", apiBodyLimit, middleware.ServerAuth)
// Internal - Boss Raid
br := internalApi.Group("/bossraid")
br.Post("/entry", brH.RequestEntry) br.Post("/entry", brH.RequestEntry)
br.Post("/start", brH.StartRaid) br.Post("/start", brH.StartRaid)
br.Post("/complete", middleware.IdempotencyRequired, brH.CompleteRaid) br.Post("/complete", middleware.IdempotencyRequired, brH.CompleteRaid)
@@ -113,25 +121,20 @@ func Register(
br.Post("/reset-room", brH.ResetRoom) br.Post("/reset-room", brH.ResetRoom)
br.Get("/server-status", brH.GetServerStatus) br.Get("/server-status", brH.GetServerStatus)
// Player Profile (authenticated) // Internal - Auth
p := api.Group("/player", middleware.Auth) internalAuth := internalApi.Group("/auth")
p.Get("/profile", playerH.GetProfile)
p.Put("/profile", playerH.UpdateProfile)
// Internal - Auth (API key auth)
internalAuth := api.Group("/internal/auth", middleware.ServerAuth)
internalAuth.Post("/verify", authH.VerifyToken) internalAuth.Post("/verify", authH.VerifyToken)
// Internal - Player (API key auth) // Internal - Player
internalPlayer := api.Group("/internal/player", middleware.ServerAuth) internalPlayer := internalApi.Group("/player")
internalPlayer.Get("/profile", playerH.InternalGetProfile) internalPlayer.Get("/profile", playerH.InternalGetProfile)
internalPlayer.Post("/save", playerH.InternalSaveGameData) internalPlayer.Post("/save", playerH.InternalSaveGameData)
// Internal - Game server endpoints (API key auth, username-based, idempotency-protected) // Internal - Chain
internal := api.Group("/internal/chain", middleware.ServerAuth) internalChain := internalApi.Group("/chain")
internal.Post("/reward", middleware.IdempotencyRequired, chainH.InternalGrantReward) internalChain.Post("/reward", middleware.IdempotencyRequired, chainH.InternalGrantReward)
internal.Post("/mint", middleware.IdempotencyRequired, chainH.InternalMintAsset) internalChain.Post("/mint", middleware.IdempotencyRequired, chainH.InternalMintAsset)
internal.Get("/balance", chainH.InternalGetBalance) internalChain.Get("/balance", chainH.InternalGetBalance)
internal.Get("/assets", chainH.InternalGetAssets) internalChain.Get("/assets", chainH.InternalGetAssets)
internal.Get("/inventory", chainH.InternalGetInventory) internalChain.Get("/inventory", chainH.InternalGetInventory)
} }