You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 5-network/05-fetch-crossorigin/article.md
+7-96Lines changed: 7 additions & 96 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -28,11 +28,7 @@ Plus sérieusement, faisons une très brève digression historique.
28
28
29
29
**Pendant de nombreuses années, un script d'un site n'a pas pu accéder au contenu d'un autre site.**
30
30
31
-
<<<<<<< HEAD
32
31
Cette règle simple mais puissante a été le fondement de la sécurité Internet. Par exemple. un script malveillant du site Web `hacker.com` ne pouvait pas accéder à la boîte aux lettres de l'utilisateur sur le site Web `gmail.com`. Les gens se sentaient en sécurité.
33
-
=======
34
-
That simple, yet powerful rule was a foundation of the internet security. E.g. an evil script from website `hacker.com` could not access the user's mailbox at website `gmail.com`. People felt safe.
35
-
>>>>>>> 468e3552884851fcef331fbdfd58096652964b5f
36
32
37
33
JavaScript n'avait pas non plus de méthodes spéciales pour effectuer des requêtes réseau à l'époque. C'était un langage pour s'amuser à décorer une page Web.
38
34
@@ -129,25 +125,15 @@ Contrairement à cela, les requêtes avec des en-têtes non standard ou par exem
129
125
130
126
Lorsque nous essayons de faire une requête non sécurisée, le navigateur envoie une demande spéciale de "contrôle en amont" qui demande au serveur -- accepte-t-il ou non ces requêtes cross-origin ?
131
127
132
-
<<<<<<<HEAD
133
128
Et, à moins que le serveur ne confirme explicitement cela avec ces en-têtes, une demande non sécurisée n'est pas envoyée.
134
-
=======
135
-
And, unless the server explicitly confirms that with headers, an unsafe request is not sent.
136
-
>>>>>>> 468e3552884851fcef331fbdfd58096652964b5f
137
129
138
130
Nous allons maintenant entrer dans les détails.
139
131
140
132
## CORS pour des requêtes sécurisées
141
133
142
-
<<<<<<< HEAD
143
134
Si une requête est une cross-origin, le navigateur lui ajoute toujours l'en-tête `Origin`.
144
135
145
136
Par exemple, si nous requêtons `https://anywhere.com/request` depuis `https://javascript.info/page`, les en-têtes ressembleront à cela :
146
-
=======
147
-
If a request is cross-origin, the browser always adds the `Origin` header to it.
148
-
149
-
For instance, if we request `https://anywhere.com/request` from `https://javascript.info/page`, the headers will look like:
Comme vous pouvez le voir, l'en-tête `Origin` contient exactement l'origine (domaine/protocole/port), sans chemin.
163
148
164
-
Le serveur peut inspecter le `Origin` et, s'il est convenu d'accepter une telle demande, ajoute un en-tête spécial `Access-Control-Allow-Origin` à la réponse. Cet en-tête doit contenir l'origine autorisée (dans notre cas `https://javascript.info`), ou une étoile `*`. Ensuite, la réponse est réussie, sinon une erreur.
165
-
=======
166
-
As you can see, the `Origin` header contains exactly the origin (domain/protocol/port), without a path.
167
-
168
-
The server can inspect the `Origin` and, if it agrees to accept such a request, add a special header `Access-Control-Allow-Origin` to the response. That header should contain the allowed origin (in our case `https://javascript.info`), or a star `*`. Then the response is successful, otherwise it's an error.
169
-
>>>>>>>468e3552884851fcef331fbdfd58096652964b5f
149
+
Le serveur peut inspecter le `Origin` et, s'il est convenu d'accepter une telle demande, ajoute un en-tête spécial `Access-Control-Allow-Origin` à la réponse. Cet en-tête doit contenir l'origine autorisée (dans notre cas `https://javascript.info`), ou une étoile `*`. Ensuite, la réponse est réussie, sinon c'est une erreur.
170
150
171
151
Le navigateur joue ici le rôle d'un médiateur de confiance :
172
152
1. Il garantit que l'`Origin` correcte est envoyée avec une requête cross-origin.
@@ -202,11 +182,7 @@ Il n'y a pas d'en-tête `Content-Length` dans la liste !
202
182
Cet en-tête contient la longueur de réponse complète. Donc, si nous téléchargeons quelque chose et que nous souhaitons suivre le pourcentage de progression, une autorisation supplémentaire est requise pour accéder à cet en-tête (voir ci-dessous).
203
183
```
204
184
205
-
<<<<<<<HEAD
206
185
Pour accorder un accès JavaScript à tout autre en-tête de réponse, le serveur doit envoyer l'en-tête `Access-Control-Expose-Headers`. Il contient une liste séparée par des virgules de noms d'en-tête non sécurisés qui doivent être rendus accessibles.
207
-
=======
208
-
To grant JavaScript access to any other response header, the server must send the `Access-Control-Expose-Headers`header. It contains a comma-separated list of unsafe header names that should be made accessible.
Avec cet en-tête `Access-Control-Expose-Headers`, le script est autorisé à lire les en-têtes `Content-Length` et `API-Key` de la réponse.
224
200
225
-
<<<<<<<HEAD
226
201
## Requêtes "Non-sécurisées"
227
-
=======
228
-
With such an `Access-Control-Expose-Headers` header, the script is allowed to read the `Content-Length` and `API-Key` headers of the response.
229
-
>>>>>>>468e3552884851fcef331fbdfd58096652964b5f
230
202
231
203
Nous pouvons utiliser n'importe quelle méthode HTTP : pas seulement `GET/POST`, mais aussi `PATCH`, `DELETE` et d'autres.
232
204
233
205
Il y a quelque temps, personne ne pouvait même imaginer qu'une page Web puisse faire de telles demandes. Il peut donc toujours exister des services web qui traitent une méthode non standard comme un signal : "Ce n'est pas un navigateur". Ils peuvent en tenir compte lors de la vérification des droits d'accès.
234
206
235
207
Ainsi, pour éviter les malentendus, toute demande "non sûre" - qui ne pouvait pas être faite par le passé, le navigateur ne fait pas de telles demandes tout de suite. Avant d'envoyer une demande préliminaire, dite de "contrôle en amont", demandant l'autorisation.
236
208
237
-
<<<<<<< HEAD
238
-
Une requête de contrôle en amont utilise la méthode `OPTIONS`, aucun corps et deux en-têtes :
209
+
Ainsi, pour éviter les malentendus, toute demande "non sécurisée" - qui ne pouvait pas être faite par le passé, le navigateur ne fait pas de telles demandes tout de suite. Premièrement, il envoie une demande préliminaire, dite de "contrôle en amont", pour demander l'autorisation.
239
210
240
-
- l'en-tête `Access-Control-Request-Method` a la méthode de la requête non sécurisée.
241
-
- l'en-tête `Access-Control-Request-Headers` fournit une liste séparée par des virgules de ses en-têtes HTTP non sécurisés.
242
-
=======
243
-
So, to avoid misunderstandings, any "unsafe" request -- that couldn't be done in the old times, the browser does not make such requests right away. First, it sends a preliminary, so-called "preflight" request, to ask for permission.
244
-
245
-
A preflight request uses the method `OPTIONS`, no body and two headers:
246
-
>>>>>>> 468e3552884851fcef331fbdfd58096652964b5f
211
+
Une demande de contrôle en amont utilise la méthode `OPTIONS`, pas de corps et deux en-têtes :
247
212
248
213
Si le serveur accepte de répondre aux requêtes, il doit répondre avec un corps vide, le statut 200 et des en-têtes :
249
214
@@ -254,11 +219,7 @@ Si le serveur accepte de répondre aux requêtes, il doit répondre avec un corp
254
219
255
220

256
221
257
-
<<<<<<< HEAD
258
222
Voyons comment cela fonctionne étape par étape, par exemple, pour une requête cross-origin `PATCH` (cette méthode est souvent utilisée pour mettre à jour les données) :
259
-
=======
260
-
Let's see how it works step-by-step on the example of a cross-origin `PATCH` request (this method is often used to update data):
261
-
>>>>>>> 468e3552884851fcef331fbdfd58096652964b5f
262
223
263
224
```js
264
225
let response = await fetch('https://site.com/service.json', {
@@ -277,11 +238,7 @@ Il y a trois raisons pour lesquelles la demande n'est pas sécurisée (une suffi
277
238
278
239
### Étape 1 (requête de contrôle en amont)
279
240
280
-
<<<<<<< HEAD
281
241
Avant d'envoyer une telle requête, le navigateur envoie lui-même une requête de contrôle en amont qui ressemble à ceci :
282
-
=======
283
-
Prior to sending such a request, the browser, on its own, sends a preflight request that looks like this:
Maintenant, le navigateur peut voir que `PATCH` est dans `Access-Control-Allow-Methods` et `Content-Type,API-Key` sont dans la liste `Access-Control-Allow-Headers`, il envoie donc la requête principale.
331
280
332
-
<<<<<<< HEAD
333
-
S'il y a un en-tête `Access-Control-Max-Age` avec un certain nombre de secondes, alors les autorisations de contrôle en amont sont mises en cache pour le temps donné. La réponse ci-dessus sera mise en cache pendant 86 400 secondes (un jour). Dans ce délai, les demandes ultérieures n'entraîneront pas de contrôle en amont. En supposant qu'ils correspondent aux quotas mis en cache, ils seront envoyés directement.
334
-
=======
335
-
If there's the header `Access-Control-Max-Age` with a number of seconds, then the preflight permissions are cached for the given time. The response above will be cached for 86400 seconds (one day). Within this timeframe, subsequent requests will not cause a preflight. Assuming that they fit the cached allowances, they will be sent directly.
336
-
>>>>>>> 468e3552884851fcef331fbdfd58096652964b5f
281
+
S'il y a un en-tête `Access-Control-Max-Age` avec un certain nombre de secondes, alors les autorisations de contrôle en amont sont mises en cache pour le temps donné. La réponse ci-dessus sera mise en cache pendant 86400 secondes (un jour). Dans ce délai, les demandes ultérieures n'entraîneront pas de contrôle en amont. En supposant qu'ils correspondent aux quotas mis en cache, ils seront envoyés directement.
337
282
338
283
### Étape 3 (requête réelle)
339
284
340
-
<<<<<<< HEAD
341
-
Lorsque le contrôle en amont réussit, le navigateur fait maintenant la requête principale. Ici, l'algorithme est le même que pour les requêtes sécurisées.
285
+
Lorsque le contrôle en amont réussit, le navigateur fait maintenant la requête principale. Ici, le processus est le même que pour les requêtes sécurisées.
342
286
343
287
La requête principale a un en-tête `Origin` (car il s'agit d'une cross-origin) :
344
-
=======
345
-
When the preflight is successful, the browser now makes the main request. The process here is the same as for safe requests.
346
-
347
-
The main request has the `Origin` header (because it's cross-origin):
348
-
>>>>>>> 468e3552884851fcef331fbdfd58096652964b5f
349
288
350
289
```http
351
290
PATCH /service.json
@@ -375,11 +314,7 @@ JavaScript n'obtient la réponse à la requête principale ou une erreur que s'i
375
314
376
315
Une requête cross-origin initiée par du code JavaScript par défaut n'apporte pas d'informations d'identification (cookies ou authentification HTTP).
377
316
378
-
<<<<<<< HEAD
379
-
C'est rare pour les requêtes HTTP. Habituellement, une requête de `http://site.com` est accompagnée de tous les cookies de ce domaine. Mais les requêtes cross-origin faites par des méthodes JavaScript sont une exception.
380
-
=======
381
-
That's uncommon for HTTP-requests. Usually, a request to `http://site.com` is accompanied by all cookies from that domain. Cross-origin requests made by JavaScript methods on the other hand are an exception.
382
-
>>>>>>> 468e3552884851fcef331fbdfd58096652964b5f
317
+
C'est rare pour les requêtes HTTP. Habituellement, une requête pour `http://site.com` est accompagnée de tous les cookies de ce domaine. Mais les requêtes cross-origin faites par des méthodes JavaScript sont une exception.
383
318
384
319
Par exemple, `fetch('http://another.com')` n'envoie aucun cookie, même ceux(!) qui appartiennent au domaine `another.com`.
385
320
@@ -425,35 +360,21 @@ Les requêtes simples doivent satisfaire aux conditions suivantes :
425
360
426
361
La différence essentielle est que les requêtes sécurisées étaient réalisables depuis très longtemps en utilisant des balises `<form>` ou `<script>`, alors que les requêtes non sécurisées étaient impossibles pour les navigateurs pendant longtemps.
427
362
428
-
<<<<<<< HEAD
429
363
Ainsi, la différence pratique est que les demandes sécurisées sont envoyées immédiatement, avec l'en-tête `Origin`, tandis que pour les autres, le navigateur fait une requête préliminaire de "contrôle en amont", demandant la permission.
430
-
=======
431
-
So, the practical difference is that safe requests are sent right away, with the `Origin` header, while for the other ones the browser makes a preliminary "preflight" request, asking for permission.
432
-
>>>>>>> 468e3552884851fcef331fbdfd58096652964b5f
433
364
434
365
**Pour les requêtes sécurisées :**
435
366
436
-
<<<<<<< HEAD
437
367
- → Le navigateur envoie l'en-tête `Origin` avec l'origine.
438
368
- ← Pour les requêtes sans informations d'identification (non envoyées par défaut), le serveur doit définir :
439
369
- `Access-Control-Allow-Origin` avec `*` ou la même valeur que `Origin`
440
370
- ← Pour les requêtes avec informations d'identification, le serveur doit définir :
441
371
- `Access-Control-Allow-Origin` avec la même valeur que `Origin`
442
372
- `Access-Control-Allow-Credentials` à `true`
443
-
=======
444
-
- → The browser sends the `Origin` header with the origin.
445
-
- ← For requests without credentials (not sent by default), the server should set:
446
-
- `Access-Control-Allow-Origin` to `*` or same value as `Origin`
447
-
- ← For requests with credentials, the server should set:
448
-
- `Access-Control-Allow-Origin` to same value as `Origin`
449
-
- `Access-Control-Allow-Credentials` to `true`
450
-
>>>>>>> 468e3552884851fcef331fbdfd58096652964b5f
451
373
452
374
En outre, pour accorder un accès JavaScript à tous les en-têtes de réponse, sauf `Cache-Control`, `Content-Language`, `Content-Type`, `Expires`, `Last-Modified` ou `Pragma`, le serveur doit répertorier ceux autorisés dans l'en-tête `Access-Control-Expose-Headers`.
453
375
454
376
**Pour les requêtes non sécurisées, une demande préalable de "contrôle en amont" est émise avant celle demandée :**
455
377
456
-
<<<<<<< HEAD
457
378
- → Le navigateur envoie la requête `OPTIONS` à la même URL, avec en-têtes :
458
379
- `Access-Control-Request-Method` a demandé la méthode.
459
380
- `Access-Control-Request-Headers` répertorie les en-têtes non sécurisés demandés.
@@ -462,13 +383,3 @@ En outre, pour accorder un accès JavaScript à tous les en-têtes de réponse,
462
383
- `Access-Control-Allow-Headers` avec une liste des en-têtes autorisés,
463
384
- `Access-Control-Max-Age` avec un certain nombre de secondes pour mettre en cache les autorisations.
464
385
- Ensuite, la requête réelle est envoyée, le schéma "sécurisé" précédent est appliqué.
465
-
=======
466
-
- → The browser sends an `OPTIONS` request to the same URL, with the headers:
467
-
- `Access-Control-Request-Method` has requested method.
0 commit comments