Właśnie przeczytałem ten artykuł, który ma kilka lat, ale opisuje sprytny sposób zabezpieczenia interfejsów API REST. Głównie:
- Każdy klient ma unikalną parę kluczy publiczny / prywatny
- Tylko klient i serwer znają klucz prywatny; nigdy nie jest przesyłany za pośrednictwem drutu
- Przy każdym żądaniu klient pobiera kilka danych wejściowych (całe samo żądanie, bieżący znacznik czasu i klucz prywatny) i przepuszcza je przez funkcję HMAC w celu wygenerowania skrótu żądania
- Następnie klient wysyła normalne żądanie (zawierające klucz publiczny) i skrót do serwera
- Serwer wyszukuje klucz prywatny klienta (na podstawie dostarczonego klucza publicznego) i dokonuje pewnej kontroli znacznika czasu (co, oczywiście, nie rozumiem), która sprawdza, czy żądanie nie jest ofiarą ataku powtórki
- Jeśli wszystko jest w porządku, serwer używa klucza prywatnego i tej samej funkcji HMAC do wygenerowania własnego skrótu żądania
- Serwer porównuje następnie oba skróty (zarówno wysłane przez klienta, jak i wygenerowane); jeśli są zgodne, żądanie jest uwierzytelniane i może być kontynuowane
Natknąłem się na JWT , który brzmi bardzo podobnie. Jednak pierwszy artykuł w ogóle nie wspomina o JWT, więc zastanawiam się, czy JWT różni się od powyższego rozwiązania uwierzytelniania, a jeśli tak, to w jaki sposób.