SQL Server w logistyce

Tabela _users_ws w bazie danych SQL Server

Sesje usług sieciowych — tymczasowe identyfikatory z terminem ważności, wydawane przy dostępie przez WebService.

sql.server.net.pl/sql/
Uśmiechnięty analityk w garniturze przy szerokim monitorze
Uśmiechnięty analityk w garniturze przy szerokim monitorze
W skrócie
  • Wiersz odpowiada jednej sesji usługi sieciowej — z własnym identyfikatorem i terminem wygaśnięcia.
  • Indeks unikalny na kolumnie SESSIONID wyklucza wydanie dwóch sesji o tym samym identyfikatorze.
  • Kolumna TERMIN ogranicza czas życia sesji, co jest podstawowym zabezpieczeniem przy dostępie programowym.
  • Wygasłe wiersze trzeba usuwać cyklicznie — inaczej tabela rośnie bez ograniczeń.

Do czego służy tabela [dbo].[_users_ws]

Gdy z systemem łączy się nie człowiek, lecz inny program — sklep internetowy pobierający stany, aplikacja mobilna, system kontrahenta — uwierzytelnianie hasłem przy każdym żądaniu byłoby zarówno powolne, jak i niebezpieczne. Zamiast tego program loguje się raz i otrzymuje tymczasowy identyfikator sesji. Tabela [dbo].[_users_ws] przechowuje te identyfikatory.

Mechanizm jest prosty i sprawdzony. Po poprawnym uwierzytelnieniu powstaje wiersz zawierający login, wygenerowany identyfikator sesji oraz termin jej ważności. Każde kolejne żądanie posługuje się już samym identyfikatorem, a system sprawdza dwie rzeczy: czy taki wiersz istnieje i czy termin jeszcze nie minął.

Ograniczenie czasu życia sesji jest tu zabezpieczeniem podstawowym. Przechwycony identyfikator pozwala działać w imieniu użytkownika, ale tylko do momentu wygaśnięcia — a ten powinien być liczony w minutach, nie w dniach. Status w kolumnie ACH pozwala dodatkowo unieważnić sesję natychmiast, bez czekania na upływ terminu.

Cykl życia sesji usługi sieciowej
Uwierzytelnienie UwierzytelnienieProgram loguje się raz, podając poświadczenia
Wydanie sesji Wydanie sesjiPowstaje wiersz z identyfikatorem i terminem ważności
Praca PracaKolejne żądania posługują się samym identyfikatorem
Wygaśnięcie WygaśnięciePo upływie terminu sesja przestaje być honorowana

Krótki termin ważności ogranicza skutki przechwycenia identyfikatora — po jego upływie jest bezwartościowy.

Budowa tabeli — wykaz kolumn

Sześć kolumn wystarcza do obsługi sesji: identyfikacja, właściciel, termin i status.

Wykaz kolumn tabeli
KolumnaTypWymaganaZnaczenie
ACHvarchar(1)
tekst do 1 znaków
takStatus reklordu, wartość domyślna 1, rekrod usunięty wartość X
ID_USERS_WSint
liczba całkowita
takIdentyfiaktor wiersza tabeli
KIEDYdatetime
data i godzina
takData i czas utworzenia zapisu
LOGINvarchar(50)
tekst do 50 znaków
takLogin użytkownika WebService
SESSIONIDvarchar(50)
tekst do 50 znaków
takTymczasowy unikalny identyfikator sesji
TERMINdatetime
data i godzina
takTermin ważności sesji zezwalajacy na zalogowanie

Kolumna SESSIONID ma pięćdziesiąt znaków, co pozwala zapisać identyfikator o wystarczającej entropii. Wartość powinna pochodzić z generatora losowego o jakości kryptograficznej — identyfikator dający się przewidzieć podważa cały mechanizm.

Indeksy i wydajność zapytań

Trzy indeksy odpowiadają weryfikacji sesji, wyszukiwaniu po użytkowniku i identyfikacji wiersza.

Indeksy zdefiniowane na tabeli
IndeksKolumnyRodzaj
LOGIN_ACHLOGIN, ACHzwykły
PK__users_wsID_USERS_WSklucz główny
SESSIONIDSESSIONIDunikalny

Indeks na kolumnie SESSIONID jest unikalny i obsługuje operację wykonywaną najczęściej ze wszystkich w tej tabeli — sprawdzenie sesji przy każdym żądaniu. Indeks LOGIN_ACH służy czemu innemu: pozwala unieważnić wszystkie aktywne sesje danego użytkownika jedną operacją, co przydaje się przy podejrzeniu przejęcia konta.

Dobór czasu życia sesji i utrzymanie tabeli

Dwie decyzje przesądzają o tym, czy mechanizm działa dobrze: jak długo żyje sesja i kto sprząta wygasłe wiersze.

Czas życia sesji a charakter integracji
ZastosowanieSugerowany terminUzasadnienie
Aplikacja mobilna magazynieraKilka godzinOdpowiada długości zmiany, nie wymusza ponownego logowania
Sklep internetowy pobierający stanyKilkanaście minutProgram odnawia sesję automatycznie, nie ma kosztu dla człowieka
Panel kontrahentaKilkadziesiąt minutKompromis między wygodą a ryzykiem porzuconej sesji
Integracja jednorazowaKilka minutSesja potrzebna wyłącznie na czas jednej operacji

Zasada ogólna: im mniej udziału człowieka w odnawianiu sesji, tym krótszy powinien być jej termin ważności.

Sprzątanie wygasłych wierszy bywa pomijane, bo nic się nie psuje — sesja po terminie i tak nie jest honorowana. Tabela rośnie jednak nadal, a przy integracji odnawiającej sesję co kilkanaście minut przyrost sięga tysięcy wierszy dziennie. Proste zadanie usuwające wpisy starsze niż doba rozwiązuje to raz na zawsze.

Jak korzystać z tabeli w praktyce

Przy obsłudze sesji usług sieciowych warto pamiętać o kilku rzeczach:

  • Generuj identyfikatory sesji z generatora losowego o jakości kryptograficznej; wartość przewidywalna podważa cały mechanizm.
  • Ustawiaj termin ważności możliwie krótki — im mniej udziału człowieka w odnawianiu sesji, tym krócej powinna żyć.
  • Usuwaj wygasłe wiersze cyklicznym zadaniem; przy częstym odnawianiu przyrost sięga tysięcy wpisów dziennie.
  • Korzystaj z indeksu LOGIN_ACH, aby unieważnić wszystkie sesje użytkownika naraz przy podejrzeniu przejęcia konta.
  • Nie przekazuj identyfikatora sesji w adresie żądania; trafia wtedy do dzienników serwera i historii przeglądarki.
  • Kontroluj liczbę równoległych sesji jednego konta — nagły wzrost bywa sygnałem, że poświadczenia zostały udostępnione.

Aktywne sesje w podziale na użytkowników, wraz z czasem pozostałym do wygaśnięcia:

SELECT  LOGIN,
        COUNT(*)                              AS SESJI,
        MIN(KIEDY)                            AS NAJSTARSZA,
        MAX(TERMIN)                           AS WYGASA_NAJPOZNIEJ,
        DATEDIFF(MINUTE, GETDATE(), MAX(TERMIN)) AS MINUT_DO_KONCA
FROM    dbo._users_ws
WHERE   ACH    <> 'X'
  AND   TERMIN >  GETDATE()
GROUP BY LOGIN
ORDER BY SESJI DESC;

Konto z kilkudziesięcioma równoległymi sesjami zwykle oznacza integrację, która zakłada nową sesję przy każdym żądaniu zamiast korzystać z istniejącej — to marnotrawstwo, które łatwo poprawić po stronie klienta.

Warto też zaplanować, co się dzieje przy restarcie serwera. Sesje zapisane w tabeli przetrwają go bez uszczerbku, w odróżnieniu od tych trzymanych w pamięci aplikacji — i jest to zaleta tego rozwiązania. Ma ona jednak drugą stronę: po awarii, po której nie wiadomo, czy identyfikatory nie wyciekły, sesje pozostają ważne. Procedura postępowania po incydencie powinna więc obejmować unieważnienie wszystkich aktywnych wierszy, a nie tylko zmianę haseł.

Sesje usług sieciowych są mechanizmem, który działa niezauważalnie i psuje się równie cicho. Zbyt długi termin ważności nie objawia się niczym, dopóki ktoś nie przechwyci identyfikatora; brak sprzątania — dopóki tabela nie urośnie do milionów wierszy. Obie rzeczy warto ustawić raz, przy uruchomieniu integracji.

Powiązane tabele i dokumentacja

Sesje usług sieciowych łączą się z kontami i danymi dostępowymi opisanymi poniżej:

FAQ

Najczęściej zadawane pytania o tabelę _users_ws

01

Jak długo powinna żyć sesja usługi sieciowej?

Tak krótko, jak pozwala na to charakter integracji. Program odnawiający sesję automatycznie może pracować na terminie kilkunastominutowym bez żadnej niedogodności. Aplikacja obsługiwana przez człowieka wymaga dłuższego terminu — porównywalnego z długością zmiany — żeby nie wymuszać ponownego logowania w trakcie pracy.

02

Czy trzeba usuwać wygasłe sesje?

Dla poprawności działania nie, bo sesja po terminie i tak nie jest honorowana. Dla rozmiaru tabeli — tak. Integracja odnawiająca sesję co kilkanaście minut generuje tysiące wierszy dziennie, a nic ich nie usuwa. Cykliczne zadanie kasujące wpisy starsze niż doba rozwiązuje problem raz na zawsze.

03

Jak unieważnić wszystkie sesje użytkownika?

Ustawiając status X we wszystkich jego aktywnych wierszach. Indeks LOGIN_ACH jest założony właśnie pod tę operację, więc wykonuje się szybko niezależnie od rozmiaru tabeli. To pierwsza rzecz do zrobienia przy podejrzeniu, że poświadczenia konta zostały przejęte.

04

Dlaczego identyfikator sesji nie powinien trafiać do adresu żądania?

Bo adresy są zapisywane w dziennikach serwera, w historii przeglądarki i w nagłówku odsyłacza przekazywanym do innych witryn. Identyfikator sesji przekazany tą drogą wycieka do miejsc, nad którymi nikt nie panuje. Właściwe jest przekazywanie go w nagłówku żądania albo w jego treści.

Słownik pojęć

Słownik pojęć

Pojęcia związane z dostępem programowym do systemu.

AAPI
Interfejs programistyczny, przez który dwa systemy wymieniają dane w czasie rzeczywistym. Pozwala zintegrować oprogramowanie magazynowe z ERP, sklepem lub przewoźnikiem.
IIntegracja z e-commerce
Połączenie sklepu internetowego z magazynem, dzięki któremu stany i statusy zamówień aktualizują się bez ręcznego przepisywania.
TTerminal Android
Przenośne urządzenie ze skanerem kodów, na którym magazynier wykonuje operacje bezpośrednio przy regale. Zastępuje papierowe listy i wprowadzanie danych po fakcie.
RRole i uprawnienia
Mechanizm przypisywania użytkownikom dostępu do funkcji i danych. Zamiast nadawać uprawnienia pojedynczo, przypisuje się je do roli odpowiadającej stanowisku.
MMicrosoft SQL Server
Serwer relacyjnej bazy danych, na którym pracują aplikacje SoftwareStudio. Odpowiada za spójność danych, uprawnienia dostępu, kopie zapasowe i wydajność zapytań.
IIndeks bazodanowy
Struktura przyspieszająca wyszukiwanie wierszy w tabeli. Dobrze dobrane indeksy skracają czas zapytań, ale spowalniają zapisy i zajmują miejsce na dysku.
SSLA
Umowa określająca gwarantowany poziom usługi — czas reakcji, czas naprawy i dostępność systemu. Ustala, czego klient może wymagać od dostawcy.
PPraca w przeglądarce
Dostęp do systemu bez instalowania programu na komputerze użytkownika. Upraszcza aktualizacje i pozwala pracować zdalnie.

Zobacz to w praktyce

Sprawdź, jak systemy SoftwareStudio oparte na MS SQL Server wspierają ten obszar Twojej firmy.