diff --git a/src/main/java/B1G4/bookmark/config/WebSocketConfig.java b/src/main/java/B1G4/bookmark/config/WebSocketConfig.java index 055c936..38e35f8 100644 --- a/src/main/java/B1G4/bookmark/config/WebSocketConfig.java +++ b/src/main/java/B1G4/bookmark/config/WebSocketConfig.java @@ -44,15 +44,20 @@ public void configureClientInboundChannel(ChannelRegistration registration) { public Message preSend(Message message, MessageChannel channel) { StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message); - if (StompCommand.CONNECT.equals(accessor.getCommand())) { - // STOMP 연결 요청에서 Authorization 헤더 추출 + if (StompCommand.CONNECT.equals(accessor.getCommand()) || + StompCommand.SUBSCRIBE.equals(accessor.getCommand()) || + StompCommand.SEND.equals(accessor.getCommand())) { + String token = accessor.getFirstNativeHeader("Authorization"); if (Objects.nonNull(token) && token.startsWith("Bearer ")) { token = token.substring(7); // "Bearer " 제거 - Authentication authentication = jwtTokenProvider.getAuthentication(token); - accessor.setUser(authentication); - SecurityContextHolder.getContext().setAuthentication(authentication); + try { + Authentication authentication = jwtTokenProvider.getAuthentication(token); + accessor.setUser(authentication); // 사용자 정보 추가 + } catch (Exception e) { + System.out.println("WebSocket Authentication failed: " + e.getMessage()); + } } } return message; diff --git a/src/main/java/B1G4/bookmark/security/provider/JwtTokenProvider.java b/src/main/java/B1G4/bookmark/security/provider/JwtTokenProvider.java index f7ec29c..69d8560 100644 --- a/src/main/java/B1G4/bookmark/security/provider/JwtTokenProvider.java +++ b/src/main/java/B1G4/bookmark/security/provider/JwtTokenProvider.java @@ -90,11 +90,12 @@ private Jws getClaims(String token) { } public Authentication getAuthentication(String token) { - Long memberId = getId(token); // Extract member ID from JWT - // Create a UserDetails-like principal (username, password, authorities) - User principal = new User(memberId.toString(), "", Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER"))); - - // Create an Authentication object using principal, credentials, and authorities - return new UsernamePasswordAuthenticationToken(principal, token, principal.getAuthorities()); + try { + Long memberId = getId(token); // Extract member ID from JWT + User principal = new User(memberId.toString(), "", Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER"))); + return new UsernamePasswordAuthenticationToken(principal, token, principal.getAuthorities()); + } catch (Exception e) { + throw new AuthException(ErrorStatus.AUTH_INVALID_TOKEN); + } } }