fix: 3차 리뷰 LOW — 에러 메시지 일관성, Redis 타임아웃, 입력 검증
Some checks failed
Server CI/CD / lint-and-build (push) Failing after 30s
Server CI/CD / deploy (push) Has been skipped

- 5개 핸들러 err.Error() → 제네릭 메시지 (Login, Refresh, SSAFY, Ticket, BossRaid)
- Redis context.Background() → WithTimeout 5s (10곳)
- SprintMultiplier 범위 검증 추가
- 방어적 문서화 (SSAFY 충돌, zip bomb, body limit prefix, 로그 주입)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-15 19:05:17 +09:00
parent 9504bf37de
commit 423e2832a0
7 changed files with 51 additions and 20 deletions

View File

@@ -1,6 +1,7 @@
package auth
import (
"log"
"regexp"
"strconv"
"strings"
@@ -70,7 +71,8 @@ func (h *Handler) Login(c *fiber.Ctx) error {
accessToken, refreshToken, user, err := h.svc.Login(req.Username, req.Password)
if err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": err.Error()})
log.Printf("Login failed (username=%s): %v", req.Username, err)
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "아이디 또는 비밀번호가 올바르지 않습니다"})
}
c.Cookie(&fiber.Cookie{
@@ -106,7 +108,8 @@ func (h *Handler) Refresh(c *fiber.Ctx) error {
newAccessToken, newRefreshToken, err := h.svc.Refresh(refreshTokenStr)
if err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": err.Error()})
log.Printf("Refresh failed: %v", err)
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "토큰 갱신에 실패했습니다"})
}
c.Cookie(&fiber.Cookie{
@@ -219,7 +222,8 @@ func (h *Handler) SSAFYCallback(c *fiber.Ctx) error {
accessToken, refreshToken, user, err := h.svc.SSAFYLogin(req.Code, req.State)
if err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": err.Error()})
log.Printf("SSAFY login failed: %v", err)
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "SSAFY 로그인에 실패했습니다"})
}
c.Cookie(&fiber.Cookie{
@@ -263,7 +267,8 @@ func (h *Handler) RedeemLaunchTicket(c *fiber.Ctx) error {
}
token, err := h.svc.RedeemLaunchTicket(req.Ticket)
if err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": err.Error()})
log.Printf("RedeemLaunchTicket failed: %v", err)
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "유효하지 않거나 만료된 티켓입니다"})
}
return c.JSON(fiber.Map{"token": token})
}