위 문서를 읽고 웹소켓에 관한 내용을 정리해보려 합니다. (틀린 내용 있을 수 있음!)
버전)
Spring-freamwork: 6.2.2
Spring-Security: 6.2.2
@Configuration
@EnableWebSocketSecurity //---(1), (2)
open class WebSocketSecurityConfig {
@Bean
fun messageAuthorizationManager(messages: MessageMatcherDelegatingAuthorizationManager.Builder): AuthorizationManager<Message<*>> {
messages.simpDestMatchers("/user/**").hasRole("USER") //---(3)
return messages.build()
}
}
( 1 ): 모든 Inbound Connect 메시지는 유효한 CSRF 토큰을 가져야한다
( 2 ): SecurityContextHolder는 모든 inboud 요청에 대해 SimpUser 헤더 속성 안에 사용자들을 채운다
( 3 ): /user 로 시작하는 모든 요청은 USER 라는 role이 필요하다.
@Configuration
open class WebSocketSecurityConfig {
fun messageAuthorizationManager(messages: MessageMatcherDelegatingAuthorizationManager.Builder): AuthorizationManager<Message<*>> {
messages
.nullDestMatcher().authenticated() //---(1)
.simpSubscribeDestMatchers("/user/queue/errors").permitAll() //---(2)
.simpDestMatchers("/app/**").hasRole("USER") //---(3)
.simpSubscribeDestMatchers("/user/**", "/topic/friends/*").hasRole("USER") //---(4)
.simpTypeMatchers(MESSAGE, SUBSCRIBE).denyAll() //---(5)
.anyMessage().denyAll() //---(6)
return messages.build();
}
}
( 1 ): destination이 없는 메시지는 사용자에게 인증을 요청.
( 2 ): 모든 사용자들은 /user/queue/erros를 구독할 수 있다.
( 3 ): /app 으로 시작하는 Destination을 가진 메시지는 User 권한을 필요로 함.
( 4 ): /user 또는 /topic/friends 의 구독은 User 권한을 필요로 함.
( 5 ): 모든 Message와 구독은 거부됨.
( 6 ): 다른 모든 요청은 거부됨. 모든 처리를 개발자가 놓치지 않기 위해 이를 해놓는 것이 권장됨.