Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,20 +39,6 @@ public Object resolveArgument(MethodParameter parameter,
log.info("HttpServletRequest is null");
throw new MemberNotFoundException("사용자 정보를 찾을 수 없습니다.");
}

String token = resolveToken(request);
if (token == null || !jwtTokenProvider.validateToken(token)) {
throw new MemberNotFoundException("사용자 정보를 찾을 수 없습니다.");
}

return jwtTokenProvider.getMemberId(token);
}

private String resolveToken(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (bearerToken != null && bearerToken.startsWith("Bearer ")) {
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.
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.
}
}
Loading