Czy identyfikatory zaplecza powinny być publiczne, czy nie w interfejsie API REST?

14

Na podstawie tego, co mówi ten facet: http://toddfredrich.com/ids-in-rest-api.html

Załóżmy, że ma rację, używając identyfikatora UUID do identyfikacji zasobów interfejsu API. Potem napotykam kłopoty, próbując to zaimplementować w następujący sposób:

class FooEntity {

    final String id = null;  //auto-generated by my backend (mongodb), not shared
    final UUID uid = UUID.randomUUID();  //the resource id
}

(Między klientem a serwerem wysyłane i odbierane są DTO, a nie jednostki bazy danych.)

Problem polega na tym, że idnie jest to przydatne, ponieważ już go nie używam. Klient wysyła żądania, uidwięc dlaczego mam kłopot z obsługą 2 identyfikatorów? Następnie wracamy do tego samego wydania na początku. Jeśli ustawię UUID jako klucz podstawowy ( _id), wówczas ujawniam identyfikator zaplecza publicznie.

Oprócz tego jest temat wydajności. Czytałem, że indeksowanie według ObjectId jest znacznie bardziej wydajne niż UUID.

anat0lius
źródło

Odpowiedzi:

7

Udostępniam identyfikator zaplecza publicznie

Jakie jeszcze środki musisz zidentyfikować swoje podmioty, gdy zostaną zwrócone w wyniku żądania? Jest to całkowicie uzasadnione i bezpieczniejsze niż SSN lub podobne identyfikatory. O tym właśnie mówi Todd - neutralizacji technologii identyfikacji i bytu i ma rację.

Temat wydajności

Możesz zachować oba identyfikatory, jeśli ObjectId jest naprawdę znacznie bardziej wydajny. Teoretycznie zawsze lepiej jest używać identyfikatorów UUID niż identyfikatorów automatycznych bazy danych.

civan
źródło
Masz rację, jeśli chodzi o ujawnienie identyfikatora. Jeśli chodzi o wydajność, wciąż nie widzę, jak mogę korzystać z obu identyfikatorów. Jeśli klient zgłasza żądanie za pomocą UUID, to wykonam zapytanie w polu UUID i uzyskam wynik. Nie mogę poznać objectid, dopóki nie odzyskam bytu. Sądzę więc, że nie ma sensu używać obu.
anat0lius
1
Może to mieć sens w przypadku starszego wsparcia. Powiedzmy, że stary identyfikator autonumeryczny jest nadal używany w starszych danych i / lub systemach. W przeciwnym razie praca z UUID
Laiv
1
W odpowiedzi na pytanie „ Jakie jeszcze środki musisz zidentyfikować swoje podmioty, gdy zostaną zwrócone w wyniku żądania? ”, Identyfikatory proxy na sesję. Najlepszą ochroną jest unikanie ujawniania użytkownikom bezpośrednich odniesień do obiektów za pomocą indeksu, pośredniej mapy odniesienia lub innej pośredniej metody, która jest łatwa do sprawdzenia
Peter Taylor
5

Nie, jeśli chodzi o bazę danych, nic o strukturze wewnętrznej nie jest narażone na zewnętrzny interfejs API. Identyfikatory nie mają inteligencji. Nie są nawet wyjątkowe w prawdziwym świecie. ID: 47 jest wszędzie. Istnieją podmioty, do których masz dostęp i prawdopodobnie możesz nimi manipulować, ale niezależnie od tego, czy baza danych przechowuje wszystko w jednej tabeli, czy dziesięciu, używa przyrostowego identyfikatora jako PK i odnosi się do FK, nigdy się nie dowiesz.

Jeśli możesz, GetUserAccountByID (12345) prosi tylko, aby ktoś spróbował GetUserAccountByID (12346). Chociaż to nie zadziała z powodu innych środków bezpieczeństwa, nawet nie próbuj i nie próbuj włamać się do firmy, prosząc o informacje na koncie: 12346. Chyba że zadzwonisz do DBA i będziesz gotów czekać 2 tygodnie na odpowiedź;)

Utwórz więc identyfikatory GUID według własnego uznania lub dowolny inny naturalny klucz, taki jak numer telefonu lub adres e-mail. Umieść unikalne ograniczenie pola w tabeli, aby uniknąć niejasnej próby kopiowania i wklejania podczas próby scalenia danych.

To nie jest zbędne. Te dwa pola służą różnym celom.

JeffO
źródło
0

O identyfikatorze wydajności vs UUID, chyba że masz wiele złączeń obejmujących wiele tabel, z których każda ma miliony rekordów, nie zrobi to aż tak dużej różnicy. Korzystanie z UUID znacznie utrudnia złomowanie aplikacji, jeśli nie zaznaczysz / nie zastosujesz bezpośrednio po stronie serwera:

  • GET [...] / 1
  • GET [...] / 2

Używanie identyfikatora jest bardzo łatwe, jeśli zamiast tego używasz UUID, jest to jedna mniejsza opcja dla skrobaka.

Identyfikator może być postrzegany jako wewnętrzny element instancji bazy danych aplikacji. W tym zdaniu są trzy ważne słowa:

  • Aplikacja: ponieważ jest to Twój model, prawdopodobnie tabele są używane tylko przez tę aplikację
  • Baza danych: jeśli wiele aplikacji używało jej w tej samej bazie danych, nic ci nie będzie
  • Instancja (bazy danych): jeśli masz system rozproszony, identyfikator będzie się ze sobą łączył i byłyby one bez znaczenia dla jakiegokolwiek innego systemu / aplikacji, która nie korzysta z instancji twojej bazy danych. UUID jest rozwiązaniem dla tego konkretnego przypadku.

Z osobistych preferencji: Wolę mieć prosty identyfikator i unikalny identyfikator firmy (poczta, login, ...). Więc jeśli będę musiał wymieniać dane, użyję identyfikatora firmy, ponieważ system docelowy może nie obsługiwać UUID, ale najprawdopodobniej (nigdy nie mów nigdy ...) dobrze poradzi sobie z unikalnym kluczem biznesowym.

Walfrat
źródło