Chciałbym zamieścić pewne wskazówki dotyczące zasobów przed połączeniem na mojej stronie, aby przeglądarki mogły (na przykład) połączyć się z CDN jQuery, zanim zobaczą znacznik skryptowy, który wywołuje CDN. Nie jestem pewien, czy powinienem dołączyć atrybut „crossorigin”, czy jaka powinna być jego wartość. Spec mówi, w części,
Aby zainicjować połączenie wstępne, agent użytkownika musi uruchomić następujące kroki:
[…]
- Niech corsAttributeState będzie bieżącym stanem
crossorigin
atrybutu content elementu .- Niech poświadczenia będą wartością logiczną ustawioną na
true
.- Jeśli corsAttributeState ma wartość,
Anonymous
a pochodzenie nie jest równe początkowi bieżącego dokumentu, ustaw poświadczenia nafalse
.- Próba uzyskania połączenia z pochodzeniem i poświadczeniami .
Nie wiem jak interpretować ten algorytm. Jeśli łączę się wstępnie z CDN, co pozwoli każdemu pobrać jego zawartość bez jakichkolwiek poświadczeń, jakiej wartości powinienem użyć dla atrybutu „crossorigin”?
html
performance
cross-origin
bdesham
źródło
źródło
Odpowiedzi:
Szukałem tego samego i znalazłem to
Stwierdza się tutaj, że jeśli nie użyjesz atrybutu cross origin, agent użytkownika po prostu wyszukuje dns, ale nie nawiązuje połączenia z określoną domeną. Tak więc atrybut crossorigin jest potrzebny, jeśli musisz połączyć się wcześniej z domeną, tak jak to:
Również jeśli chcesz wysłać dane uwierzytelniające do tej konkretnej domeny, możesz ustawić wartość crossorigin, ponieważ w
crossorigin = use-credentials
przeciwnym razie uważam, że wartość domyślna jest anonimowa.źródło
crossorigin
spowoduje podobnie marnowanie połączenia, ponieważ nowe połączenie musi zostać otwarte, że nie używa CORS.Do tej pory rozumiem użycie
crossorigin
, szczególnie pod względem jego wartości,anonymous
iuse-credentials
powinieneś używaćcrossorigin="use-credentials"
w przypadku:Oprócz cytowanej przez ciebie dokumentacji mam to i tamto . Ale w rzeczywistości dokumentacja wprowadza w błąd i zawiera błędy ortograficzne: pierwsze to nazywa
use-credentials
, drugie -user-credentials
.W każdym razie, w moim rozumieniu:
crossorigin
jest równycrossorigin="anonymous"
crossorigin
równa sięcrossorigin="use-credentials"
Może ktoś mnie poprawi.
PS : Obecna wersja strony Mozilli na ten temat oznacza:
Oznacza:
crossorigin
w ogóle nie,crossorigin
lubcrossorigin="use_credentials"
wszystkie są traktowane jakcrossorigin="anonymous"
.źródło
crossorigin
jest równecrossorigin="anonymous"
.To zależy od dwóch rzeczy:
W przypadku jQuery nie będziesz używać
crossorigin
. Skrypty nie należą do rodzajów zasobów, które przeglądarki używają do pobierania za pomocą CORS .Czcionki natomiast używają CORS.
crossorigin
atrybut.crossorigin
. GdybyOto post Przepełnienie stosu, w którym napotkałem ten sam problem.
Nie zanurkowałem, kiedy potrzebne są poświadczenia CORS. Nie widziałem przykładu, w którym są potrzebne, więc są szanse, że jesteś bezpieczny
crossorigin
(tj. `Crossorigin =" anonimowy ").źródło
Wszystkie dotychczasowe odpowiedzi wydają się uproszczone, niekompletne lub częściowo błędne (temat jest złożony, rzeczy są myląco nazwane i niezbyt dobrze udokumentowane!), Oto moje rozumienie:
Aby móc ponownie użyć połączenia utworzonego przez
<link rel=preconnect>
, wszystko zależy od tego, jaki rodzaj treści chcesz pobrać, skąd, czy żądanie wyśle dane uwierzytelniające przeglądarki (które mogą być ustanowione przez przeglądarkę jawnie lub niejawnie):Żądanie ma to samo pochodzenie (
example.com
żądania z pod -źródłaexample.com
)Po pierwsze, wcale nie ma takiej potrzeby
preconnect
; przeglądarka utrzymuje połączenie otwarte po ładowaniu strony przez dłuższy czas. Jeśli istnieje wiele połączeń do otwarcia, przeglądarka sama decyduje, czy i ile otworzyć (w zależności od tego, czy serwer ogłasza obsługę HTTP / 2 w uzgadnianiu TLS, ustawieniach przeglądarki itp.)do sprawdzenia : co jeśli
crossorigin
atrybut tego samego pochodzenia ma atrybut: czy jest używany czy ignorowany?Żądanie pochodzi z różnych źródeł (
example.com
żądania z pod -źródłaanother.com
)crossorigin
atrybut w HTML ( w JS - ważna jest wielkość liter), musi też mieć to połączenie wstępne o tej samej wartości (być może z wyjątkiem przypadków, w których nie ma to sensu i jest ignorowane - nie do końca jasne ja jeszcze)crossOrigin
crossorigin
<script type=module>
: do sprawdzenia<img>
,<style type=stylesheet>
,<iframe>
, klasyczne<script>
itp (inicjowane poprzez HTML lub JS) bezcrossorigin
wyraźnie określonej , wówczas wstępne łączenie nie może miećcrossorigin
zestaw atrybutów.crossorigin=anonymous
fetch
lubXHR
:credentials !== omit
; w przypadku XHRwithCredentials === true
:): połączenie wstępne musi miećcrossorigin=use-credentials
crossorigin=anonymous
W ostatnim przypadku (fetch / XHR) przejdź do panelu sieciowego w devtools Chrome / Firefox, kliknij prawym przyciskiem myszy żądanie i wybierz
copy as fetch
z menu rozwijanego. Spowoduje to utworzenie fragmentu kodu JS, który poinformuje Cię, czy to żądanie obsługuje CORS ("mode"=="cors"
) i jest poświadczone ("credentials"=="include"|"same-origin"
).Uwaga jednak podstęp powyżej nie działa poprawnie dla non-XHR / pobrać wnioski, bo na przykład
fetch
i<img>
używać różnych algorytmów do ustanowienia połączenia, jak wyjaśniono wcześniej.Wreszcie w HTML
<link ...crossorigin>
===<link ...crossorigin=anonymous>
.Dodatkowe uwagi i linki:
źródło