Buduję aplikację internetową i usługę RESTful.
Czytałem różne artykuły na temat najlepszego sposobu uwierzytelnienia żądań w serwisie internetowym.
Wydaje mi się, że najlepszą opcją jest podstawowe uwierzytelnianie HTTP. Niemal każdy artykuł, który przeczytałem, mówi, że uwierzytelnianie powinno być szyfrowane za pomocą protokołu SSL lub równoważnego.
Nie jestem do końca pewien, co się z tym wiąże. Czy to oznacza, że cała moja usługa internetowa będzie musiała znajdować się na bezpiecznym serwerze? Czy to spowolni?
web-services
rest
authentication
ssl
https
Gaz_Edge
źródło
źródło
Odpowiedzi:
Przede wszystkim spróbuj zrozumieć, jak działa uwierzytelnianie SSL (HTTPS) i HTTP.
Zwykłe metody uwierzytelniania HTTP (Digest, Basic i wszelkie formularze + schemat uwierzytelniania oparty na plikach cookie, które można wdrożyć na HTTP) same w sobie są niepewne, ponieważ wysyłają informacje uwierzytelniające mniej więcej w postaci czystego tekstu. Niezależnie od tego, czy dane znajdują się w polach POST, czy w nagłówkach i czy zastosowano kodowanie base64, nie ma w tym względzie żadnego znaczenia, hasło jest wyraźnie widoczne dla każdego, kto ma dostęp do ruchu sieciowego. Oznacza to, że uwierzytelnianie HTTP w niezaufanym kanale jest bezwartościowe: atakujący musi odczytać hasło tylko po to, by wąchać sieć.
SSL implementuje bezpieczny kanał komunikacyjny poprzez z natury niepewny kanał. Działa to mniej więcej tak:
Zwróć uwagę na kilka ważnych punktów tutaj:
Oczywiście wiąże się to z pewnymi kosztami ogólnymi, ale nie jest tak źle, jak mogłoby się wydawać - głównie w skali, w której „rzuć na to więcej sprzętu” jest odpowiednią reakcją, chyba że przygotowujesz się na absolutnie ogromne natężenie ruchu ( pomyśl Google lub Facebook). W normalnych okolicznościach, to jest w typowym użyciu aplikacji internetowych, narzut SSL jest znikomy, w związku z czym, gdy tylko masz jakiekolwiek poufne dane, najlepiej po prostu uruchomić wszystko przez SSL, w tym zasoby. SSL to także jedyny możliwy sposób zabezpieczenia ruchu HTTP; inne metody po prostu nie są tak ujednolicone i dlatego nie są szeroko wspierane, i absolutnie nie chcesz wdrażać tych rzeczy samodzielnie, ponieważ szczerze mówiąc, po prostu zbyt łatwo jest je pomylić.
TL; DR: Tak, uwierzytelnianie podstawowe SSL + jest dobrym pomysłem, tak, potrzebujesz bezpiecznego serwera (i ważnego certyfikatu ), tak, to trochę spowolni, ale nie, nie należy się tym martwić teraz.
źródło
HTTPS (SSL) nie jest FYI uwierzytelnienia użytkownika. Po prostu zapewnia szyfrowanie między 2 punktami końcowymi.
Ale tak, jest z tego trochę drobny narzut (choć niewystarczający, aby uzasadnić zmianę planów / sprzętu). Spójrz tutaj :
/programming/548029/how-much-overhead-does-ssl-impose
źródło
W przypadku podstawowego uwierzytelniania HTTP nazwa użytkownika i hasło podane przez użytkownika są wysyłane z każdym żądaniem do serwera. Oznacza to, że są w postaci zwykłego tekstu, nawet w obszarach witryny, które niekoniecznie muszą być bezpieczne. Oczywiście, potrzebujesz SSL tutaj, aby zapewnić bezpieczeństwo użytkownikom.
Teoretycznie możesz użyć uwierzytelniania plików cookie i umieścić SSL tylko na stronie logowania (gdzie wysyłana jest nazwa użytkownika i hasło). Jeśli twoje pliki cookie są przyzwoicie bezpieczne i zabezpieczone przed atakami z powtórką, osoba atakująca nie byłaby w stanie nic z nimi zrobić, nawet gdyby udało się je zdobyć.
źródło
Podstawowym uwierzytelnianiem jest ustawienie nazwy użytkownika i hasła w nagłówku żądania http. Jeśli nie używasz protokołu SSL lub równoważnego, ta nazwa użytkownika i hasło są wysyłane zwykłym tekstem i są banalne dla każdego, kto może je ukraść.
Większość serwerów WWW obsługuje obecnie HTTPS od razu po wyjęciu z pudełka i chociaż powoduje to dodatkowe obciążenie w przypadku każdego połączenia, to narzut jest minimalny.
Możesz zabezpieczyć niektóre punkty końcowe, a nie inne (tj. Mieć uwierzytelniony punkt końcowy, który produkuje token, którego można używać do innych połączeń). Zdecydowanie poleciłbym protokół SSL dla całej usługi, ponieważ jest on znacznie bardziej bezpieczny. (jeśli nic innego nie zatrzymuje przechwytywania poufnych danych)
źródło
Jeff Atwood napisał niedawno krótki post na blogu o tym, czy najlepszym rozwiązaniem jest pełne szyfrowanie. Opisuje kilka przykładów z prawdziwego świata i ma też kilka uwag na temat wydajności.
Odwołuje się także do tego artykułu na temat studium przypadku Gmaila, cytując:
Wspomina także o niedawnych ulepszeniach buforowania stron po stronie klienta przez HTTPS przez przeglądarkę .
Mimo to, zauważa, istnieją inne kary, z których większość nie dotyczy wydajności, ale koszty wdrożenia:
źródło
Podstawowe uwierzytelnianie HTTP bez obsługi własnej sesji prawdopodobnie pozostawi cię otwartym na ataki fałszowania żądań między witrynami. Prawdopodobnie możesz go użyć, jeśli połączysz się z własną obsługą sesji, ale możesz mieć problemy z zapewnieniem czystej funkcji „wylogowania”.
Bez względu na to, czego używasz do uwierzytelniania, będziesz musiał użyć HTTPS do szyfrowania połączenia (chyba że aplikacja internetowa jest dostępna tylko w kontrolowanej, bezpiecznej sieci). Może to nieco spowolnić (ustanawianie połączeń jest drogie, ale przeglądarki zazwyczaj utrzymują połączenia przez pewien czas), ale jeśli chcesz bezpiecznej aplikacji, nie będziesz w stanie jej ominąć, więc tak naprawdę nie potrzebujesz martwić się o to.
Uwaga: „Uwierzytelnianie HTTPS” (o którym wspomniałeś w tytule) wprowadza w błąd - może odnosić się do uwierzytelniania certyfikatu klienta SSL, które ma niewiele wspólnego z tekstem twojego pytania i ma własny zestaw korzyści i problemów. Prawdopodobnie nie chcesz tego dotykać.
źródło
Jak zamierzasz przeprowadzić podstawowe uwierzytelnianie?
Jeśli jest to mocno zakodowana nazwa użytkownika / hasło i używasz do tego wbudowanej funkcjonalności swojego serwera, prawdopodobnie będzie to miało prawie zerowy wpływ. Jeśli robisz szalone rzeczy w bazie danych lub coś podobnego, to może to mieć wpływ.
Jak zauważyli inni, SSL i wysyłanie dodatkowych nagłówków sprawi, że technicznie będzie to wolniejsze, ale w żaden sposób nie będzie znaczące.
źródło