[Spring] 웹소켓에서 가상의 유저(Principal) 생성하기(no Security)

웹소켓에서의 유저

스프링 시큐리티(Spring Security)를 사용하는 웹서버의 경우 사용자 정보를 사용하여 인증을 진행하게 되는데 이때 클라이언트의 경우에도 자신의 고유 정보를 통해 사용자 정보와 매칭할 수 있다.
만약 시큐리티(Security)를 사용하지 않을 경우 messagingTemplate.convertAndSendToUser함수를 사용 시 sessionId를 사용해야 하는 불편함이 있는데 이럴 때 가상의 사용자를 생성하면 편하게 사용할 수 있 게 된다.

유저 생성

1
2
3
4
5
6
7
8
9
10
11
12
public class AssignPrincipalHandshakeHandler extends DefaultHandshakeHandler {
@Override
protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map<String, Object> attributes) {
String name = UUID.randomUUID().toString();
return new Principal() {
@Override
public String getName() {
return name;
}
};
}
}

유저 생성 핸들러 사용

1
2
3
4
5
6
7
8
9
10
@Configuration
@EnableWebSocketMessageBroker
public class StompWebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket")
.setHandshakeHandler(new AssignPrincipalHandshakeHandler())
.withSockJS();
}
}

클라이언트 접속 시 유저 확인

1
2
3
4
5
6
7
8
9
10
11
12
@Component
public class SessionEventListener {
@EventListener
private void handleSessionConnected(SessionConnectedEvent event) {
StompHeaderAccessor accessor
= MessageHeaderAccessor.getAccessor(
(GenericMessage)event.getMessage().getHeaders().get("simpConnectMessage"), StompHeaderAccessor.class);
String userId = accessor.getUser().getName();
String sessionId = accessor.getSessionId();
System.out.println("userId = " + userId);
}
}

댓글

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×