Skip to content
Merged
Show file tree
Hide file tree
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 @@ -68,7 +68,7 @@ public void notifyAlarm(AlarmType alarmType, Object object, User user) {
return;
}
FcmDirectDto fcmDirectDto = alarmMessageHandler.getFcmDirectDto(object, user);
fcmService.sendToUsers(fcmDirectDto);
fcmService.sendToUsersIfTokenExists(fcmDirectDto);
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,18 @@ public class FcmService {
private final UserQueryService userQueryService;
private final UserService userService;

public void sendToUsersIfTokenExists(FcmDirectDto fcmDirectDto) {
User user = userService.getUser();
Optional<UserFcmToken> token = userFcmTokenRepository.findByUser(user);

if (token.isEmpty()) {
log.info("FCM 토큰이 존재하지 않는 유저입니다. userId={}", user.getId());
return;
}

sendToUsers(fcmDirectDto);
}
Comment on lines +39 to +49
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

치명적 결함: 잘못된 사용자의 토큰을 확인하고 있습니다

현재 구현은 수신자가 아닌 현재 인증된 사용자의 FCM 토큰을 확인합니다.

문제점:

  • Line 40: userService.getUser()는 현재 인증된 사용자(예: 친구 요청을 보낸 사용자 A)를 반환합니다
  • 하지만 알림을 받아야 하는 사용자는 fcmDirectDto.userIds()에 포함된 수신자들(예: 친구 요청을 받는 사용자 B)입니다
  • 따라서 잘못된 사용자의 토큰 존재 여부를 확인하여 수신자가 토큰이 없어도 전송을 시도하거나, 반대로 수신자는 토큰이 있는데 전송하지 않을 수 있습니다

예시 시나리오:

  1. 사용자 A(토큰 있음)가 사용자 B(토큰 없음)에게 친구 요청
  2. 현재 코드는 A의 토큰을 확인 → 존재함 → sendToUsers 호출
  3. sendToUsers는 B에게 전송 시도 → B는 토큰이 없어서 예외 발생 (Line 122)
  4. 원래 의도한 예외 방지가 작동하지 않음
🔎 수정 제안

수신자 목록에서 토큰이 있는 사용자들에게만 전송하도록 변경:

 public void sendToUsersIfTokenExists(FcmDirectDto fcmDirectDto) {
-    User user = userService.getUser();
-    Optional<UserFcmToken> token = userFcmTokenRepository.findByUser(user);
+    List<User> users = userQueryService.getUsersByIds(fcmDirectDto.userIds());
+    List<UserFcmToken> userFcmTokens = userFcmTokenRepository.findByUserIn(users);
 
-    if (token.isEmpty()) {
-        log.info("FCM 토큰이 존재하지 않는 유저입니다. userId={}", user.getId());
+    if (userFcmTokens.isEmpty()) {
+        log.info("FCM 토큰이 존재하지 않는 유저입니다. userIds={}", fcmDirectDto.userIds());
         return;
     }
 
     sendToUsers(fcmDirectDto);
 }

참고: 이렇게 수정하면 일부 사용자만 토큰이 없는 경우에도 Line 122의 validateUserToken에서 예외가 발생합니다. 토큰이 있는 사용자에게만 전송하려면 추가 필터링 로직이 필요합니다.

Committable suggestion skipped: line range outside the PR's diff.


public void sendToUsers(FcmDirectDto request) {
List<User> users = userQueryService.getUsersByIds(request.userIds());

Expand Down
Loading