SignalR의 사용자 및 그룹 관리
작성자: Brennan Conroy
SignalR 을 사용하면 특정 사용자와 연결된 모든 연결 및 명명된 연결 그룹으로 메시지를 보낼 수 있습니다.
SignalR의 사용자
SignalR의 단일 사용자는 앱에 대한 여러 연결을 가질 수 있습니다. 예를 들어 사용자는 자신의 휴대폰뿐 아니라 데스크톱에도 연결될 수 있습니다. 각 디바이스에는 별도의 SignalR 연결이 있지만 모두 동일한 사용자와 연결됩니다. 사용자에게 메시지를 보내는 경우 해당 사용자와 연결된 모든 연결에서 메시지를 받습니다. 허브의 Context.UserIdentifier
속성을 사용하여 연결에 대한 사용자 ID에 액세스할 수 있습니다.
기본적으로 SignalR에서는 연결과 연결된 ClaimsPrincipal
의 ClaimTypes.NameIdentifier
를 사용자 식별자로 사용합니다. 이 동작을 사용자 지정하려면 클레임을 사용하여 처리 사용자 지정 identity 을 참조하세요.
다음 예제와 같이 허브 메서드의 User
함수에 사용자 ID를 전달하여 특정 사용자에게 메시지를 보냅니다.
참고 항목
사용자 ID는 대/소문자를 구분합니다.
public Task SendPrivateMessage(string user, string message)
{
return Clients.User(user).SendAsync("ReceiveMessage", message);
}
SignalR의 그룹
그룹은 이름과 연관된 연결의 컬렉션입니다. 그룹의 모든 연결에 메시지를 보낼 수 있습니다. 그룹은 애플리케이션에서 관리되기 때문에 연결 또는 다중 연결에 전송하는 데 권장되는 방법입니다. 연결은 여러 그룹의 멤버일 수 있습니다. 그룹은 각 공간을 그룹으로 표시할 수 있는 채팅 애플리케이션과 같은 항목에 적합합니다.
그룹에서 연결 추가 또는 제거
연결은 다음 및 RemoveFromGroupAsync
메서드를 통해 AddToGroupAsync
그룹에 추가되거나 그룹에서 제거됩니다.
public async Task AddToGroup(string groupName)
{
await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
}
public async Task RemoveFromGroup(string groupName)
{
await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);
await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}.");
}
그룹에 사용자를 여러 번 추가하는 것이 안전합니다. 사용자가 이미 그룹에 있는 경우 예외가 throw되지 않습니다.
연결이 다시 연결되면 그룹 멤버 자격은 유지되지 않습니다. 다시 설정된 후 연결을 그룹에 다시 조인해야 합니다. 애플리케이션이 여러 서버로 확장되는 경우 이 정보를 사용할 수 없으므로 그룹의 멤버 수를 계산할 수 없습니다.
그룹은 메모리에 유지되므로 서버 다시 시작을 통해 유지되지 않습니다. 그룹 멤버 자격을 유지해야 하는 시나리오의 경우 Azure SignalR 서비스를 고려합니다. 자세한 내용은 Azure를 참조하세요 . SignalR
그룹을 사용하는 동안 리소스에 대한 액세스를 보호하려면 ASP.NET Core의 인증 및 권한 부여 기능을 사용합니다. 해당 그룹에 대한 자격 증명이 유효한 경우에만 사용자를 그룹에 추가하면 해당 그룹으로 전송된 메시지는 권한 있는 사용자에게만 이동합니다. 단, 그룹은 보안 기능이 아닙니다. 인증 클레임에는 만료 및 해지와 같이 그룹이 사용하지 않는 기능이 있습니다. 그룹에 액세스할 수 있는 사용자의 권한이 취소된 경우 앱은 그룹에서 사용자를 명시적으로 제거해야 합니다.
참고 항목
그룹 이름은 대/소문자를 구분합니다.
추가 리소스
ASP.NET Core