Loading...
Spring Framework Reference Documentation 7.0.2의 Token Authentication의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Spring Security OAuth는 JSON Web Token (JWT)을 포함한 토큰 기반 시큐리티를 지원합니다. 이것을 웹 애플리케이션에서의 인증 메커니즘으로 사용할 수 있으며, 이전 섹션에서 설명한 것처럼 STOMP over WebSocket 상호 작용에서도 (쿠키 기반 세션을 통해 아이덴티티를 유지하기 위해) 사용할 수 있습니다.
동시에, 쿠키 기반 세션이 항상 최선의 선택은 아닙니다(예를 들어, 서버 사이드 세션을 유지하지 않는 애플리케이션이나 인증을 위해 헤더를 사용하는 것이 일반적인 모바일 애플리케이션의 경우).
WebSocket protocol, RFC 6455는 "서버가 WebSocket 핸드셰이크 동안 클라이언트를 인증할 수 있는 특정한 방법을 규정하지 않습니다." 그러나 실제로는 브라우저 클라이언트는 표준 인증 헤더(즉, basic HTTP authentication)나 쿠키만 사용할 수 있으며 (예를 들어) 커스텀 헤더를 제공할 수 없습니다.
마찬가지로, SockJS JavaScript 클라이언트는 SockJS 트랜스포트 요청과 함께 HTTP 헤더를 보내는 방법을 제공하지 않습니다. sockjs-client issue 196를 참고하십시오. 대신, 쿼리 파라미터를 보내는 것은 허용하며, 이를 사용해 토큰을 보낼 수 있지만, 그것은 자체적인 단점이 있습니다(예를 들어, 토큰이 서버 로그에서 URL과 함께 실수로 로깅될 수 있습니다).
위에서 언급한 제한 사항은 브라우저 기반 클라이언트에만 해당하며,<br>WebSocket과 SockJS 요청 모두에서 헤더 전송을 지원하는<br>Spring Java 기반 STOMP 클라이언트에는 적용되지 않습니다.
따라서, 쿠키 사용을 피하고자 하는 애플리케이션은 HTTP 프로토콜 레벨에서 인증을 위한 적절한 대안이 없을 수 있습니다. 쿠키 대신, STOMP 메시징 프로토콜 레벨에서 헤더를 사용해 인증하는 것을 선호할 수 있습니다. 이렇게 하려면 두 가지 간단한 단계가 필요합니다:
ChannelInterceptor로 인증 헤더를 처리합니다.다음 예제는 서버 사이드 설정을 사용하여 커스텀 인증
인터셉터를 등록하는 방법을 보여줍니다. 인터셉터는 CONNECT Message에서
user 헤더를 인증하고 설정하기만 하면 된다는 점에 유의하십시오.
Spring은 인증된 user를 기록하고 저장하며, 동일한 세션의 이후 STOMP 메시지와 연관시킵니다. 다음 예제는 커스텀 인증 인터셉터를 등록하는 방법을 보여줍니다:
1@Configuration 2@EnableWebSocketMessageBroker 3public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer { 4 5 @Override 6 public void configureClientInboundChannel(ChannelRegistration registration) { 7 registration.interceptors(new ChannelInterceptor() { 8 @Override 9 public Message<?> preSend(Message<?> message, MessageChannel channel) { 10 StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); 11 if (StompCommand.CONNECT.equals(accessor.getCommand())) { 12 // Access authentication header(s) and invoke accessor.setUser(user) 13 } 14 return message; 15 } 16 }); 17 } 18}
1@Configuration 2@EnableWebSocketMessageBroker 3class WebSocketConfiguration : WebSocketMessageBrokerConfigurer { 4 5 override fun configureClientInboundChannel(registration: ChannelRegistration) { 6 registration.interceptors(object : ChannelInterceptor { 7 override fun preSend(message: Message<*>, channel: MessageChannel): Message<*> { 8 val accessor = MessageHeaderAccessor.getAccessor( 9 message, 10 StompHeaderAccessor::class.java 11 ) 12 if (StompCommand.CONNECT == accessor!!.command) { 13 // Access authentication header(s) and invoke accessor.setUser(user) 14 } 15 return message 16 } 17 }) 18 } 19}
또한, Spring Security의 메시지 인가를 사용할 때는 현재
인증 ChannelInterceptor 설정이 Spring Security의 것보다
먼저 실행되도록 순서를 보장해야 한다는 점에 유의하십시오.
이는 커스텀 인터셉터를 자체 WebSocketMessageBrokerConfigurer
구현에 선언하고, 그 구현에 @Order(Ordered.HIGHEST_PRECEDENCE + 99)를
지정함으로써 가장 잘 수행할 수 있습니다.
Authentication
Authorization