Jetez un œil à ces questions d'entretien de navigateur. À combien pouvez-vous répondre correctement ?
青灯夜游
Libérer: 2022-03-23 10:39:59
avant
3658 Les gens l'ont consulté
Cet article partagera avec vous quelques questions d'entretien sur les navigateurs. Voyez à combien vous pouvez répondre ? Analysez les bonnes réponses et voyez combien vous pouvez en obtenir !
1. Quels sont les noyaux courants des navigateurs ?
Le noyau du navigateur peut être divisé en deux parties :
渲染引擎和JS引擎 (Remarque : le noyau du navigateur auquel nous faisons souvent référence fait référence au moteur de rendu)
Puisque le moteur JS devient de plus en plus indépendant, le noyau fait référence uniquement au moteur de rendu, le moteur de rendu est principalement utilisé pour demander que les ressources des pages réseau soient analysées, composées et présentées à l'utilisateur
Chrome
Blink ( 28~) Webkit (Chrome 27) afari
Webkit
JavaScriptCore
Edge
EdgeHTML
Chakra (pour JavaScript)
IE
Trident
Chakra (pour JScript)
Opera
Presto->blink
Linear A (4.0-6. 1)/Linéaire B (7,0 -9.2)/Futhark (9.5-10.2)/ Carakan (10.5-)
Node.js
-
V8
2. Quels sont les principaux composants d'un navigateur ?
Interface utilisateur : comprend la barre d'adresse, les boutons avant/arrière/actualisation/signet et autres boutons
Moteur de navigateur : transmet les instructions entre l'interface utilisateur et le moteur de rendu
Moteur de rendu : utilisé pour dessiner les requêtes Contenu
Réseau : utilisé pour effectuer des appels réseau, tels que des requêtes http, il possède une interface indépendante de la plate-forme et peut fonctionner sur différentes plates-formes
Interpréteur JavaScript : utilisé pour analyser et exécuter du code JavaScript
Interface utilisateur Backend : Utilisé pour dessiner des widgets de base, tels que des zones de liste déroulante et des fenêtres. La couche inférieure utilise l'interface utilisateur du système d'exploitation
Stockage des données : Elle appartient à la couche de persistance. , HTML5 Définit la technologie de base de données Web, qui est une technologie de stockage légère et complète côté client
Remarque : contrairement à la plupart des navigateurs, chaque onglet du navigateur Google (Chrome) correspond chacun à une instance du moteur de rendu. Chaque onglet est un processus indépendant
3. Dites-moi ce qui se passe entre la saisie de l'URL et le rendu de la page ?
Cette question peut être considérée comme la question la plus courante lors des entretiens et peut être infiniment difficile. Généralement, les intervieweurs posent cette question pour tester la profondeur de vos connaissances frontales.
1. Le navigateur accepte l'URL et ouvre le fil de requête réseau (impliquant : le mécanisme du navigateur, le fil et le processus, etc.)
2 Ouvre le fil de discussion réseau et émet une requête http complète (impliquant : requête DNS, TCP. /IP, protocole réseau 5 couches, etc.)
3. Recevoir la requête du serveur vers le backend correspondant pour recevoir la requête (impliquant : l'équilibrage de charge, l'interception de sécurité, le traitement interne du backend, etc.)
4. . Interaction HTTP entre le backend et le frontend (impliquant To : en-têtes http, codes de réponse, structures de messages, cookies, etc.)
5. Problèmes de cache (impliquant : cache http fort et cache négocié, en-têtes de cache, etag, expiré, cache-control, etc.)
6. Navigateur Le processus d'analyse après la réception du paquet de données http (impliquant une analyse lexicale HTML, une analyse dans une arborescence DOM, une analyse CSS pour générer une arborescence CSSOM et une fusion pour générer une arborescence de rendu. Ensuite mise en page, rendu de peinture, synthèse de couches composites, dessin GPU, traitement des liens externes, etc.)
7 modèle visuel css (impliquant : règles de rendu des éléments, telles que : bloc contenant, boîte de contrôle, BFC, IFC, etc.)
.
8. Processus d'analyse du moteur JS (impliquant : l'étape d'analyse JS, l'étape de prétraitement, la phase d'exécution génère le contexte d'exécution, le VO (objet global), la chaîne de portée, le mécanisme de recyclage, etc.)
Vous constaterez qu'il y en a tellement processus se produisant entre une simple URL d'entrée et le rendu de la page, avez-vous l'impression que cela plante instantanément ? (Ne vous inquiétez pas, nous n'entrerons pas dans cette profondeur dans ce chapitre. Nous allons d'abord vous apprendre à répondre à cette question ? . Cette section sera abordée dans un article séparé plus tard)
Le navigateur obtient l'adresse IP du nom de domaine via le serveur DNS et envoie une requête à cette adresse IP. Demande d'obtention du texte HTML
Le processus de rendu du navigateur. analyse le texte HTML et construit l'arborescence DOM
Lors de l'analyse du HTML, s'il rencontre un style ou un fichier de style en ligne, il téléchargera et construira les règles de style. S'il rencontre un script JavaScript, il l'exécutera.
Une fois l'arborescence DOM et CSSOM construits, le processus de rendu fusionne les deux dans un arbre de rendu
Le processus de rendu commence à disposer l'arbre de rendu et à générer un arbre de mise en page
Arbre de rendu versus arbre de mise en page Réaliser le dessin et générer enregistrements de dessin
4. Comment le navigateur analyse-t-il le code ?
Parse HTML
Le HTML est analysé ligne par ligne et le moteur de rendu du navigateur analysera et convertira le document HTML en nœuds DOM.
Parse Html dans de nombreux jetons
Parse jetons dans des objets
combines objets dans un arbre Dom
Parse CSS
Le navigateur analysera les sélecteurs CSS de droite à gauche
Nous savons que l'arborescence DOM et l'arborescence CSSOM sont fusionnées dans l'arborescence de rendu, qui attache en fait le CSSOM à l'arborescence DOM, de sorte que l'arborescence DOM doit être parcourue en fonction des informations fournies par le sélecteur.
Trouvez d'abord tous les spans de nœuds les plus à droite, et pour chaque span, recherchez vers le haut le nœud div.title
de h3 et puis vers le haut Lorsque le nœud
de div.nav trouve enfin l'élément racine html, le parcours de cette branche se termine.
Parse JS
Il existe un outil d'analyse js dans le navigateur, qui est spécialement utilisé pour analyser notre code js.
Lorsque le navigateur rencontre du code js, il appelle immédiatement "l'analyseur js" au travail.
L'analyseur trouvera toutes les variables, fonctions, paramètres, etc. dans js et attribuera la valeur de la variable à undefined.
Sortez la fonction dans un bloc fonctionnel et stockez-la dans l'entrepôt. Une fois cela fait, le code commence à être analysé ligne par ligne (de haut en bas, de gauche à droite), puis mis en correspondance avec l'entrepôt.
5.Quelle est la différence entre DOMContentLoaded et Load ?
DOMContentLoaded : déclenché uniquement une fois l'analyse DOM terminée, à l'exclusion des feuilles de style, des images et d'autres ressources.
Chargement : déclenché lorsque tous les DOM, feuilles de style, scripts, images et autres ressources de la page ont été chargés.
6. Quelle est la différence entre la refonte du navigateur et la réorganisation du domaine ?
Réarrangement : Une partie de l'arbre de rendu ou l'ensemble de l'arbre de rendu doit être réanalysé et la taille des nœuds doit être recalculée, ce qui se traduit par une régénération de la mise en page et une réorganisation des éléments
Redessin : En raison de changements dans le propriétés géométriques ou styles des nœuds Les changements, tels que les éléments d'arrière-plan des éléments, se manifestent par la modification de l'apparence de certains éléments. déclencher le redessinage et la refusion ?
Toute modification des informations utilisées pour construire l'arbre de rendu entraînera une redistribution ou un redessinage :
Ajouter, supprimer, mettre à jour les nœuds DOM Masquer un nœud DOM via l'affichage : aucun - déclencher une redistribution et redessiner Masquer un nœud DOM via la visibilité : caché - déclenche uniquement un redessin, car il n'y a pas de changements géométriques
Déplacer ou animer des nœuds DOM dans la page
Ajouter une feuille de style et ajuster les propriétés du style Comportement de l'utilisateur, tel que redimensionner la fenêtre, changer la taille de la police ou faire défiler.
Comment éviter de redessiner ou de refusionner ?
Changement de styles concentré : par exemple, utilisez la classe pour changer collectivement de styles
Utilisez document.createDocumentFragment() : nous pouvons créer un document libre de l'arborescence DOM via le nœud createDocumentFragment, puis des opérations par lots sont effectuées sur ce nœud, et finalement insérées dans l'arborescence DOM, de sorte qu'une seule redistribution est déclenchée
Promotion vers une couche de compositionLa promotion d'un élément vers une couche de composition présente les avantages suivants :
这个CSSOM体现在DOM中就是document.styleSheetsLes bits du calque de composition L'image sera synthétisée par le GPU, qui est plus rapide que le traitement du CPU
Lorsque repeindre</code > est nécessaire, seul <code>repaint lui-même n'affectera pas les autres calques
Pour les effets transformation et opacité, mise en page</ code> et <code ne seront pas déclenchés >paintLa meilleure façon d'améliorer un calque de composition est d'utiliser la propriété CSS will-change
7. Pourquoi JS est-il monothread ?
Cela est principalement lié à l'objectif de JS. En tant que langage de script du navigateur, JS était initialement principalement utilisé pour réaliser l'interaction entre l'utilisateur et le navigateur et pour faire fonctionner le DOM. Cela détermine qu'il ne peut être qu'un seul thread, sinon cela entraînera de nombreux problèmes de synchronisation complexes.
Par exemple : Si JS est multi-thread, un thread veut modifier un élément DOM et un autre thread veut supprimer l'élément DOM, alors le navigateur ne sait pas qui écouter. Ainsi, afin d'éviter toute complexité, JavaScript a été conçu pour être monothread depuis sa naissance.
Afin de profiter de la puissance de calcul des CPU multicœurs, HTML5 propose le standard Web Worker, qui permet aux scripts JavaScript de créer plusieurs threads, mais les threads enfants sont entièrement contrôlés par le thread principal et ne doivent pas faire fonctionner le DOMAINE. Par conséquent, cette nouvelle norme ne change pas la nature monothread de JavaScript
8. Le chargement CSS bloquera-t-il le DOM ? Tout d'abord la conclusion🎜🎜
🎜🎜CSS ne bloquera pas l'analyse du DOM, mais il bloquera le rendu du DOM< /code> 🎜🎜<code>CSS bloquera l'exécution de JS, mais ne bloquera pas le téléchargement des fichiers JS🎜🎜
🎜 Le rôle du CSSOM est reflété dans le DOM sous la forme document .styleSheets🎜🎜🎜🎜Nous pouvons le voir dans le processus de rendu du navigateur mentionné précédemment : 🎜🎜🎜🎜DOM et CSSOM sont généralement construits en parallèle, donc 🎜Le chargement CSS ne bloquera pas Analyse DOM🎜🎜🎜 🎜🎜L'arbre de rendu dépend de l'arbre DOM et de l'arbre CSSOM, il doit donc attendre que les deux soient chargés avant de pouvoir commencer à créer le rendu, donc 🎜Le chargement CSS bloquera le rendu du DOM🎜🎜🎜🎜🎜 Puisque JavaScript peut faire fonctionner DOM et CSS , si l'interface est rendue en modifiant les propriétés de ces éléments (c'est-à-dire que le thread JavaScript et le thread UI sont exécutés en même temps), les éléments obtenus avant et après le thread de rendu peuvent être incompatible. Ainsi, afin d'éviter des résultats de rendu inattendus, le navigateur définit le 🎜thread de rendu GUI et le thread JavaScript pour qu'ils s'excluent mutuellement🎜🎜🎜🎜🎜🎜🎜JS doit attendre le téléchargement du CSS. Pourquoi est-ce ? (CSS bloque l'exécution du DOM)🎜🎜🎜
Si le contenu du script JS doit obtenir le style de l'élément, alors il doit s'appuyer sur du CSS. Étant donné que le navigateur ne peut pas détecter ce qui se passe dans JS, afin d'éviter l'acquisition de styles, il doit attendre que tous les styles précédents soient téléchargés avant d'exécuter JS. Cependant, les fichiers JS et CSS sont téléchargés en parallèle. Le fichier CSS sera chargé et exécuté avant l'exécution du fichier JS suivant, donc JS脚本的内容是获取元素的样式,那它就必然依赖CSS。因为浏览器无法感知JS内部到底想干什么,为避免样式获取,就只好等前面所有的样式下载完毕再执行JS。但JS文件与CSS文件下载是并行的,CSS文件会在后面的JS文件执行前先加载执行完毕,所以CSS会阻塞后面JS的执行
defer是在JS加载完成后,整个文档解析完成后,触发 DOMContentLoaded 事件前执行,如果缺少 srcCSS bloquera l'exécution des JS suivants
Évitez l'écran blanc et améliorez l'apparence. vitesse de chargement de CSS
Utilisez CDN (CDN sélectionnera le nœud le plus proche avec le contenu mis en cache pour vous fournir des ressources en fonction des conditions de votre réseau, afin de réduire le temps de chargement) Compressez CSS Utilisez le cache de manière raisonnable
Réduire le nombre de requêtes http, fusionner les fichiers CSS
9. JS bloquera-t-il la page ?
Concluons d'abord
JS bloquera le parsing du DOM
, et donc bloquera le chargement de la page
C'est pourquoi on dit souvent qu'il faut mettre le fichier JS en bas
Puisque JavaScript peut manipuler le DOM, si vous modifiez les propriétés de ces éléments lors du rendu de l'interface (c'est-à-dire que le thread JavaScript et le thread UI s'exécutent en même temps), les données des éléments obtenues avant et après le thread de rendu peut être incohérent.
Par conséquent, afin d'éviter des résultats de rendu inattendus, le navigateur définit la relation **"Le fil de rendu GUI et le moteur JavaScript s'excluent mutuellement"**.
Lors de l'exécution du moteur JavaScript, le thread GUI sera suspendu et les mises à jour de l'interface graphique seront enregistrées dans une file d'attente et exécutées immédiatement lorsque le thread du moteur est inactif.
Lorsque le navigateur exécute un programme JavaScript, le fil de rendu de l'interface graphique sera enregistré dans une file d'attente et ne sera exécuté que lorsque le programme JS sera terminé.
Donc si le temps d'exécution de JS est trop long, cela entraînera un rendu de la page incohérent, donnant l'impression que le rendu et le chargement de la page sont bloqués.
10. Quelle est la différence entre différer et asynchrone ?
Les deux chargent les fichiers JS externes de manière asynchrone et ne bloqueront pas l'analyse DOM.
Async est exécuté une fois le chargement JS externe terminé, lorsque le navigateur est inactif et avant le déclenchement de l'événement Load. Les scripts marqués comme asynchrones ne sont pas garantis. pour suivre le Spécifiez l'ordre dans lequel ils sont exécutés. Cet attribut n'a aucun effet sur les scripts en ligne (c'est-à-dire les scripts sans l'attribut "src").
defer est exécuté après le chargement du JS, après l'analyse de l'intégralité du document et avant le déclenchement de l'événement DOMContentLoaded si l'attribut src (c'est-à-dire le script intégré). est manquant, cet attribut ne devra pas être utilisé car il ne fonctionne pas dans ce cas
11. Mécanisme de récupération de place du navigateur
Le nettoyage de la mémoire est un mécanisme de gestion automatique de la mémoire. La mémoire dynamique de votre ordinateur doit être libérée lorsqu'elle n'est plus nécessaire.
Il convient de noter que automatique signifie que le navigateur peut automatiquement nous aider à recycler les déchets de mémoire, mais cela ne signifie pas que nous n'avons pas besoin de nous soucier de la gestion de la mémoire. S'il ne fonctionne pas correctement, un débordement de mémoire se produira toujours en JavaScript. , provoquant le crash du système. 🎜🎜🎜Étant donné que les chaînes, tableaux, objets, etc. n'ont pas de tailles fixes, ils doivent être alloués dynamiquement lorsque leurs tailles sont connues. Chaque fois qu'un programme JavaScript crée une chaîne, un tableau ou un objet, l'interpréteur doit allouer de la mémoire pour stocker cette entité. 🎜🎜L'interpréteur JavaScript peut détecter quand le programme n'utilise plus un objet. Lorsqu'il détermine que l'objet est inutile, il sait que l'objet n'est plus nécessaire et peut libérer la mémoire qu'il occupe. 🎜🎜Il existe deux méthodes de collecte des déchets généralement utilisées par les navigateurs : 🎜mark scanning🎜, 🎜reference counting🎜. 🎜🎜🎜🎜Mark clearing🎜🎜🎜🎜🎜Il s'agit de la méthode de garbage collection la plus couramment utilisée en JavaScript🎜🎜🎜Depuis 2012, tous les navigateurs modernes ont utilisé la méthode de garbage collection de mark clearing, à l'exception des versions inférieures d'IE Reference counting. 🎜🎜🎜Alors, qu’est-ce que la suppression des marques ? 🎜🎜🎜🎜Il existe un objet global en JavaScript. Périodiquement, le garbage collector partira de cet objet global, trouvera tous les objets référencés à partir de cet objet global, puis trouvera les objets référencés par ces objets... Pour ces objets actifs marquage, c’est la phase de marquage. L'étape de nettoyage consiste à nettoyer les objets qui ne sont pas marqués. 🎜🎜🎜Un problème avec l'effacement des marques est qu'après l'effacement, l'espace mémoire est discontinu, c'est-à-dire qu'une fragmentation de la mémoire se produit. Si un espace mémoire continu relativement important est nécessaire ultérieurement, il ne répondra pas aux exigences. La méthode 🎜organisation des marques🎜 peut résoudre efficacement ce problème. 🎜🎜Dans le processus de marquage, le concept de marquage tricolore est introduit. Les trois couleurs sont : 🎜🎜🎜Blanc : les objets non marqués, c'est-à-dire les objets inaccessibles (objets non scannés), peuvent être recyclés 🎜🎜Gris. : Objets qui ont été marqués (objets accessibles), mais les objets n'ont pas encore été scannés et ne peuvent pas être recyclés 🎜🎜Noir : ont été scannés (objets accessibles) et ne peuvent pas être recyclés 🎜🎜🎜🎜 Tri des marquages : 🎜🎜
La phase de marquage n'est pas différente de la méthode mark and clear, sauf qu'une fois le marquage terminé, la méthode mark and clear déplacera les objets survivants d'un côté de la mémoire et nettoiera enfin la mémoire limite.
Comptage de références
La signification du comptage de références est de suivre le nombre de fois où chaque valeur est référencée. Lorsqu'une variable A reçoit une valeur, le nombre de références à cette valeur est de 1. Lorsque la variable A est réaffectée, le nombre de références à la valeur précédente est réduit de 1. Lorsque le nombre de références devient 0, cela signifie qu'il n'y a plus moyen d'accéder à cette valeur, donc la mémoire occupée par cette valeur peut être effacée.
La plupart des navigateurs ont abandonné cette méthode de recyclage
Fuite mémoire
Pour éviter les fuites mémoire, une fois que les données ne sont plus utilisées, il est préférable de définir leur valeur sur null </ code>Pour libérer sa référence, cette méthode est appelée <code>null来释放其引用,这个方法叫做接触引用
看上面这张图,有些资源的size值是大小,有些是from disk cache,有些是from memory cache,显示大小的是请求的服务器资源,而显示后面两种的则是读取的缓存。
disk cache: 就是将资源存储在磁盘中,等待下次访问时不需重新下载,直接从磁盘中读取,它的直接操作对象为CurlCacheManagerRéférence de contact
Quelles situations provoqueront des fuites de mémoire ? Comment l'éviter ?
En prenant Vue comme exemple, il existe généralement ces situations :
Les événements surveillés dans window/body ne sont pas indépendants
Les événements liés à EventBus sont non dissocié Après avoir dissocié le $store de
Vuex, watch n'a pas unwatch
créé à l'aide d'un bibliothèque tierce. La fonction de destruction correcte n'est pas appelée
Solution : Détruire à temps dans beforeDestroy
Lier l'événement addEventListener< dans le <code>DOM/BOM. objet /code>, removeEventListener.
Mode observateur $on, traitement $off.
Si une minuterie est utilisée dans un composant, elle doit être détruite.
Si une initialisation de bibliothèque tierce est utilisée dans le hook monté/créé, elle sera détruite en conséquence.
Utilisez les références faibles weakMap, weakSet.
Quand les mémoires des différents types de variables dans le navigateur sont-elles publiées ?
Les types de référence
sont automatiquement recyclés par V8 lorsqu'il n'y a plus de référence.
Type basique🎜
🎜S'il est dans une fermeture, il ne sera pas recyclé par V8 tant que la fermeture n'aura plus de référence. 🎜🎜En cas de non fermeture, il sera recyclé en attendant le switch nouvelle génération du V8. 🎜🎜🎜🎜
12. Parlez-nous du mécanisme de mise en cache du navigateur ?
🎜🎜🎜Comprendre le cache du navigateur🎜🎜🎜🎜Lorsque le navigateur demande un site Web, il chargera diverses ressources pour certaines ressources qui ne changent pas fréquemment, le navigateur les enregistrera dans la mémoire locale pour la prochaine fois. Chargez ces ressources. directement pendant l’accès pour améliorer la vitesse d’accès. 🎜🎜🎜🎜Comment savoir si la ressource est demandée par le serveur ou lue depuis le cache ? 🎜🎜🎜🎜🎜 🎜Regardez l'image ci-dessus. La valeur de taille de certaines ressources est la taille, certaines proviennent du du cache disque et d'autres du du cache mémoire. ressource serveur demandée. Les deux dernières sont affichées comme cache de lecture. 🎜
🎜🎜cache disque : 🎜 consiste à stocker les ressources sur le disque et à attendre le prochain accès sans retélécharger. Il peut être lu directement à partir du disque. Son objet d'opération directe est CurlCacheManager. . (L'efficacité est plus lente que le cache mémoire, mais la capacité de stockage est grande et la durée de stockage est longue) 🎜🎜🎜cache mémoire : 🎜 Il s'agit de mettre en cache les ressources dans la mémoire, et d'attendre le prochain accès sans retélécharger, lire directement à partir de la mémoire. (C'est le plus rapide du point de vue de l'efficacité, et le plus court du point de vue du temps de survie.) 🎜🎜🎜🎜🎜🎜-🎜🎜cache mémoire🎜🎜cache disque🎜🎜🎜🎜🎜🎜Mêmes points🎜🎜 peuvent Stockez uniquement certains fichiers de ressources dérivées🎜🎜Seuls certains fichiers de ressources dérivées peuvent être stockés🎜🎜🎜🎜La différence🎜🎜Les données seront effacées à la sortie du processus🎜🎜Les données ne seront pas effacées à la sortie du processus🎜🎜🎜🎜Stockage ressources🎜🎜Général Les scripts, les polices et les images seront stockés en mémoire. Généralement, les non-scripts seront stockés en mémoire, comme les CSS, etc.🎜🎜🎜🎜.
Classification du cache du navigateur
Cache fort
Cache de négociation
Lorsque le navigateur demande des ressources au serveur, il détermine d'abord s'il atteint le cache fort, et s'il échoue, il détermine s'il atteint le cache de négociation
Cache fort
Lorsque le navigateur charge les ressources, il déterminera d'abord si le cache fort est touché en fonction du en-tête de la ressource du cache local s'il atteint. , la ressource dans le cache sera utilisée directement et ne sera plus renvoyée au cache. Le serveur envoie la requête. header中判断是否命中强缓存,如果命中则直接使用缓存中的资源,不会再向服务器发送请求。 (这里的header中的信息指的是 expires 和 cache-control)
Expires
该字段是 http1.0 时的规范,它的值为一个绝对时间的 GMT 格式的时间字符串,比如 Expires:Mon,18 Oct 2066 23:59:59 GMT。这个时间代表着这个资源的失效时间,在此时间之前,即命中缓存。这种方式有一个明显的缺点,由于失效时间是一个绝对时间,所以当服务器与客户端时间偏差较大时,就会导致缓存混乱。所以这种方式很快在后来的HTTP1.1版本中被抛弃了。
当强缓存没命中时,浏览器会发送一个请求到服务器,服务器根据 header 中的信息来判断是否命中协商缓存。如果命中,则返回304 ,告诉浏览器资源未更新,可以使用本地缓存。 (这里的header信息指的是Last-Modify/If-Modify-Since 和 ETag/If-None-Match(Les informations dans l'en-tête ici font référence à expires et cache-control)
Expires
Ce champ est
http1.0
spécification d'heure, sa valeur est une chaîne d'heure
heure absolue
au format GMT, telle que Expires:Mon,18 Oct 2066 23:59:59 GMT. Cette heure représente l'heure d'expiration de cette ressource. Avant cette heure, le cache est atteint. Cette méthode présente un inconvénient évident. Étant donné que le délai d'expiration est un délai absolu, lorsque l'écart de temps entre le serveur et le client est important, cela entraînera une confusion dans le cache. Cette méthode a donc été rapidement abandonnée dans la version ultérieure de HTTP 1.1.
Cache-Control
Cache-Control est l'information d'en-tête qui apparaît lorsque http1.1 Elle est principalement jugée en utilisant la valeur
max-age
de ce champ. temps relatif
Par exemple, Cache-Control:max-age=3600 signifie que la période de validité de la ressource est de 3600 secondes. En plus de ce champ, cache-control a également les valeurs de paramètre suivantes, plus couramment utilisées :
no-cache
: Vous devez négocier le cache et envoyer une demande au serveur pour confirmer si vous souhaitez utiliser le cache.
no-store
: désactivez l'utilisation du cache et demandez à nouveau des données à chaque fois.
public : peut être mis en cache par tous les utilisateurs, y compris les utilisateurs finaux et les serveurs proxy intermédiaires tels que CDN.
privé : il ne peut être mis en cache que par le navigateur de l'utilisateur final et n'est pas autorisé à être mis en cache par des serveurs de cache relais tels que CDN.
Cache-Control et Expires peuvent être activés en même temps dans la configuration du serveur Lorsqu'il est activé en même temps, Cache-Control a une priorité plus élevée.
Cache de négociation🎜🎜Lorsque le cache fort manque, le navigateur envoie une requête au serveur, et le serveur détermine si le cache de négociation est atteint en fonction des informations contenues dans en-tête . S'il atteint, 🎜304🎜 est renvoyé, indiquant au navigateur que la ressource n'a pas été mise à jour et que le cache local peut être utilisé. 🎜(Les informations d'en-tête ici font référence à Last-Modify/If-Modify-Since et ETag/If-None-Match)🎜🎜🎜🎜🎜🎜Last-Modify / If-Modify-Since🎜🎜🎜🎜🎜Lorsque le navigateur demande une ressource pour la première fois, Last-Modify sera ajouté à l'en-tête renvoyé par le serveur. Last-modify est une heure qui identifie l'heure de la dernière modification de la ressource. . 🎜🎜Lorsque le navigateur demandera à nouveau la ressource, l'en-tête de la requête contiendra If-Modify-Since, qui est le Last-Modify renvoyé avant la mise en cache. Une fois que le serveur a reçu If-Modify-Since, il détermine si le cache est atteint en fonction de l'heure de la dernière modification de la ressource. 🎜🎜Si le cache est atteint, 304 est renvoyé et le contenu de la ressource n'est pas renvoyé et Last-Modify n'est pas renvoyé. 🎜🎜Inconvénients :🎜🎜Si les ressources changent dans un court laps de temps, Last-Modified ne changera pas. 🎜🎜Changements cycliques. Si cette ressource est modifiée pour retrouver son apparence d'origine au cours d'un cycle, nous pensons qu'elle peut être mise en cache, mais Last-Modified ne le pense pas, il existe donc un ETag. 🎜🎜🎜🎜🎜ETag/If-None-Match🎜🎜🎜🎜🎜La différence avec Last-Modify/If-Modify-Since est que Etag/If-None-Match renvoie un code de vérification. ETag peut garantir que chaque ressource est unique et les modifications de ressources entraîneront des modifications d'ETag. Le serveur détermine si le cache est atteint en fonction de la valeur If-None-Match envoyée par le navigateur. 🎜🎜La différence avec Last-Modified est que lorsque le serveur renvoie une réponse 304 Not Modified, puisque l'ETag a été régénéré, l'ETag sera renvoyé dans l'en-tête de réponse, même si l'ETag n'a pas changé par rapport au précédent. 🎜🎜🎜Last-Modified et ETag peuvent être utilisés ensemble. Le serveur vérifiera d'abord l'ETag s'il est cohérent, il continuera à comparer Last-Modified et décidera enfin s'il doit renvoyer 304. 🎜🎜🎜🎜🎜Résumé🎜🎜🎜🎜🎜Lorsque le navigateur accède à une ressource déjà visitée, ses étapes sont les suivantes : 🎜🎜🎜1 Vérifiez d'abord si le cache fort est touché. S'il atteint ?, utilisez le cache directement🎜🎜2. . Si le cache fort n'est pas atteint, la requête sera envoyée au serveur pour voir si elle atteint le cache de négociation 🎜🎜3 Si le cache de négociation est atteint, le serveur renverra 304 pour indiquer au navigateur qu'il s'agit du cache local. peut être utilisé. 4. Si le cache de négociation n'est pas atteint, le serveur renverra de nouvelles ressources au navigateur🎜
13.什么是浏览器的同源策略,以及跨域?
同源策略
同源策略是浏览器的一种自我保护行为。所谓的同源指的是:协议,域名,端口均要相同
浏览器中大部分内容都是受同源策略限制的,但是以下三个标签不受限制:
<img src="..." / alt="Jetez un œil à ces questions d'entretien de navigateur. À combien pouvez-vous répondre correctement ?" >
<link href="..." />
<script src="..."></script>
<img src="http://bank.example/withdraw?amount=10000&for=hacker" alt="Jetez un œil à ces questions d'entretien de navigateur. À combien pouvez-vous répondre correctement ?" >
Un pirate informatique ne peut utiliser que le cookie de la victime pour frauder la confiance du serveur, mais le pirate informatique ne peut pas obtenir le **"cookie"** et ne peut pas voir le contenu du **"cookie"cookie 骗取服务器的信任,但是黑客并不能凭借拿到**「cookie」**,也看不到 **「cookie」的内容。另外,对于服务器返回的结果,由于浏览器「同源策略」**的限制,黑客也无法进行解析。
这就告诉我们,我们要保护的对象是那些可以直接产生数据改变的服务,而对于读取数据的服务,则不需要进行CSRF. De plus, les pirates ne peuvent pas analyser les résultats renvoyés par le serveur en raison des limitations de la « Same Origin Policy »** du navigateur. Cela nous indique que les objets que nous voulons protéger sont des services qui peuvent directement produire des modifications de données, et pour les services qui lisent des données, il n'y a pas besoin de protection CSRF. La clé de la protection est
"Mettez des informations dans la demande que les pirates ne peuvent pas falsifier"
Détection originale
Étant donné que la plupart des CSRF proviennent de sites Web tiers, nous interdisons directement les domaines externes (ou non Domaine de confiance noms) nous font des demandes.
La question est alors de savoir comment déterminer si la demande provient d'un domaine externe ?
Dans le protocole HTTP, chaque requête asynchrone porte deux Headers pour marquer le nom de domaine source :
Origin Header
Referer Header
Lorsque le navigateur initie une requête, ces deux Headers seront dans la plupart des cas apportés automatiquement et le contenu ne peut pas être personnalisé par le front-end. Le serveur peut déterminer le domaine source de la requête en analysant les noms de domaine dans ces deux en-têtes.
Utilisez l'en-tête Origin pour déterminer le nom de domaine source
Dans certaines requêtes liées au CSRF, le champ Origin sera porté dans l'en-tête demandé. Le champ contient le nom de domaine demandé (hors chemin et requête).
Si Origin existe, vous pouvez directement utiliser les champs dans Origin pour confirmer le nom de domaine source.
Mais Origin n'existe pas dans les deux cas suivants :
Politique de même origine IE11 : IE 11 n'ajoutera pas l'en-tête Origin sur les requêtes CORS intersites, l'en-tête Referer sera toujours l'identifiant unique. La raison la plus fondamentale est que la définition de la même origine dans IE 11 est différente de celle des autres navigateurs. Il existe deux différences principales. Vous pouvez vous référer à la redirection
MDN Same-origin_policy#IE_Exceptions
:
Origine après la redirection 302. Non inclus dans. les demandes redirigées car Origin peuvent être considérées comme des informations sensibles provenant d’autres sources. Dans le cas des redirections 302, l'URL est dirigée vers le nouveau serveur, le navigateur ne souhaite donc pas divulguer l'Origin vers le nouveau serveur.
Utilisez Referer Header pour déterminer le nom de domaine source
Selon le protocole HTTP, il existe un champ appelé Referer dans l'en-tête HTTP, qui enregistre l'adresse source de la requête HTTP. Pour les requêtes Ajax, les requêtes de ressources telles que les images et les scripts, Referer est l'adresse de la page qui initie la requête. Pour les sauts de page, Referer est l’adresse de la page précédente qui a ouvert l’historique des pages. Nous pouvons donc utiliser la partie Origin du lien dans le Referer pour connaître le nom de domaine source de la requête.
Cette méthode n'est pas infaillible. La valeur de Referer est fournie par le navigateur. Bien qu'il existe des exigences claires dans le protocole HTTP, chaque navigateur peut avoir des implémentations différentes de Referer, et il n'y a aucune garantie que le navigateur lui-même ne présente aucune faille de sécurité. . La méthode de vérification de la valeur du Referer repose sur un tiers (c'est-à-dire le navigateur) pour garantir la sécurité. En théorie, cela n'est pas très sûr. Dans certains cas, les attaquants peuvent masquer ou même modifier le Referer qu'ils demandent.
En 2014, le groupe de travail sur la sécurité des applications Web du W3C a publié le projet de politique de référencement, qui contient des dispositions détaillées sur la manière dont les navigateurs doivent envoyer le référent. À l'heure actuelle, la plupart des nouveaux navigateurs prennent en charge cette version, et nous pouvons enfin contrôler de manière flexible la stratégie de référencement de notre site Web. La nouvelle version de la politique de référencement stipule cinq politiques de référencement : aucun référent, aucun référent en cas de rétrogradation, origine uniquement, origine en cas d'origine croisée et URL non sécurisée. Les trois stratégies existantes : jamais, par défaut et toujours ont été renommées dans la nouvelle norme. Leur correspondance est la suivante :
<img src="http://bank.example/withdraw?amount=10000&for=hacker" referrerpolicy="no-referrer" alt="Jetez un œil à ces questions d'entretien de navigateur. À combien pouvez-vous répondre correctement ?" >
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn