Skip to content

Conversation

@GoGradually
Copy link
Collaborator

변경된 점

  • 회원 ID 주입 방식을 Authorization 헤더에서 X-Member-Id 헤더로 변경

Copilot AI review requested due to automatic review settings December 31, 2025 10:11
@GoGradually GoGradually merged commit fc7c590 into master Dec 31, 2025
3 checks passed
@GoGradually GoGradually deleted the feat/Member-Id-주입-방식-변경 branch December 31, 2025 10:11
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

이 PR은 회원 ID 주입 방식을 JWT 기반 인증에서 X-Member-Id 헤더 기반으로 변경합니다.

주요 변경사항:

  • Authorization 헤더의 Bearer 토큰 검증 로직을 제거하고 X-Member-Id 헤더 값을 직접 사용
  • JWT 토큰 파싱 및 검증 관련 메서드(resolveToken, validateToken, getMemberId) 제거

return bearerToken.substring(7);
}
return null;
return Long.parseLong(request.getHeader("X-Member-Id"));
Copy link

Copilot AI Dec 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

문제점: JWT 토큰 기반의 인증/검증 로직이 완전히 제거되어, X-Member-Id 헤더 값을 아무런 검증 없이 신뢰하고 있습니다. 이는 심각한 보안 취약점입니다.

영향: 악의적인 사용자가 임의의 X-Member-Id 값을 헤더에 설정하여 다른 사용자로 위장할 수 있습니다. 인증/인가 없이 모든 사용자의 데이터에 접근 가능합니다.

수정 제안:

  1. API Gateway나 상위 레이어에서 JWT 검증 후 X-Member-Id를 주입하는 방식이라면, 해당 헤더가 신뢰할 수 있는 소스에서만 올 수 있도록 네트워크 레벨의 보안 설정이 필수적입니다.
  2. 또는 JWT 검증 로직을 유지하되, 검증된 토큰에서 추출한 Member ID를 사용하는 방식으로 변경해야 합니다.
Suggested change
return Long.parseLong(request.getHeader("X-Member-Id"));
String authorizationHeader = request.getHeader("Authorization");
if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
log.warn("Authorization 헤더가 없거나 Bearer 토큰 형식이 아닙니다. authorizationHeader={}", authorizationHeader);
throw new MemberNotFoundException("인증 정보가 유효하지 않습니다.");
}
String token = authorizationHeader.substring("Bearer ".length());
try {
// JwtTokenProvider 를 통해 JWT 토큰을 검증하고, 검증된 토큰에서 memberId 를 추출한다.
Long memberId = jwtTokenProvider.getMemberId(token);
if (memberId == null) {
log.warn("JWT 토큰에서 memberId 를 추출하지 못했습니다.");
throw new MemberNotFoundException("유효하지 않은 사용자 정보입니다.");
}
return memberId;
} catch (Exception e) {
log.warn("JWT 토큰 검증 또는 memberId 추출에 실패했습니다.", e);
throw new MemberNotFoundException("유효하지 않은 사용자 정보입니다.");
}

Copilot uses AI. Check for mistakes.
return bearerToken.substring(7);
}
return null;
return Long.parseLong(request.getHeader("X-Member-Id"));
Copy link

Copilot AI Dec 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

문제점: X-Member-Id 헤더가 null이거나 숫자가 아닌 값일 경우 NullPointerException 또는 NumberFormatException이 발생합니다.

영향: 명확하지 않은 예외 메시지로 인해 클라이언트가 문제를 파악하기 어렵고, 서버 로그에도 불필요한 스택 트레이스가 남게 됩니다.

수정 제안: 헤더 값에 대한 null 체크 및 숫자 형식 검증을 추가하고, 검증 실패 시 적절한 에러 메시지와 함께 MemberNotFoundException을 던져야 합니다.

Suggested change
return Long.parseLong(request.getHeader("X-Member-Id"));
String memberIdHeader = request.getHeader("X-Member-Id");
if (memberIdHeader == null || memberIdHeader.isBlank()) {
log.info("X-Member-Id 헤더가 누락되었거나 비어 있습니다.");
throw new MemberNotFoundException("유효한 사용자 정보를 찾을 수 없습니다. (X-Member-Id 헤더 누락)");
}
try {
return Long.parseLong(memberIdHeader);
} catch (NumberFormatException e) {
log.info("X-Member-Id 헤더 값이 숫자 형식이 아닙니다. value={}", memberIdHeader, e);
throw new MemberNotFoundException("유효한 사용자 정보를 찾을 수 없습니다. (X-Member-Id 형식 오류)");
}

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants