Spring Secuirty simple création de projet et analyse de l'interaction de communication entre le navigateur et le serveur basé sur la capture de wirehark

1. Environnement

Suite d'outils Spring: Version: 4.1.2.RELEASE Outil de développement intégré
Maven: 3.5.4 Outil de gestion des dépendances
Springboot: 2.1.4. RELEASE
Wireshark: Version 2.4.5 Outil d'analyse de capture de paquets de protocole de communication
Éditeur de requête HTTP: requête HTTP V1.0 Outil de simulation
Google Chrome: 74.0.3729.169 (version officielle) (32 bits) Navigateur Google
Microsoft Edge: 44.18362.329.0 Navigateur Microsoft

2. Créez un projet de sécurité Spring simple

2.1. Assistant pour créer un projet

Insérez la description de l'image ici

Insérez la description de l'image ici
Remarque: Veuillez sélectionner 2.1.4 pour cette étape, sinon il peut y avoir une erreur dans la première ligne de pom.xml.

Insérez la description de l'image ici
Après avoir cliqué, la barre d'état affichera le modèle de téléchargement et la progression de la génération du squelette du projet
Insérez la description de l'image ici

Vérifiez pom.xml et voyez que les dépendances suivantes sont automatiquement introduites:
Insérez la description de l'image ici
Parmi elles, les deux dépendances liées à secuirty sont:

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<scope>test</scope>
		</dependency>

2.2 Créer une méthode de contrôleur simple

@RestController
@SpringBootApplication
public class Springsecuritytest001Application {
    
    

	@GetMapping("/")
	public String hello(){
    
    
		return "hello, spring security";
	}
	public static void main(String[] args) {
    
    
			SpringApplication.run(Springsecuritytest001Application.class, args);
	}

}

Ajouter l'API rest à la classe Springsecuritytest001Application créée automatiquement

@GetMapping("/")
	public String hello(){
    
    
		return "hello, spring security";
	}

Et ajoutez l'annotation
@RestController au niveau de la classe

2.3. Essai de fonctionnement

Insérez la description de l'image ici
La console générera le mot de passe de l'utilisateur par défaut (utilisateur) de http.
Utilisez un navigateur pour visiter 127.0.0.1:8080, et elle passera à la page de connexion.
Insérez la description de l'image ici

Utilisez le nom d'utilisateur utilisateur et le mot de passe aléatoire imprimé sur la console avant pour le remplir, puis cliquez sur connexion
Insérez la description de l'image ici
Insérez la description de l'image ici

2.4 Configurer le nom d'utilisateur et le mot de passe d'authentification HTTP via le fichier de configuration

Ajoutez
spring.security.user.name = test
spring.security.user.password = 123456
au fichier application.properties et réexécutez. À ce stade , la console ne générera plus de mots de passe aléatoires.
Accès au navigateur:
Insérez la description de l'image ici
Insérez la description de l'image ici

Analyse de capture de paquets à 3 fils

Insérez la description de l'image ici
Comme vous pouvez le voir, il y a 4 séries de demandes et de réponses

3.1. Demande de client Round 1, connexion de redirection de serveur

Demande du client (http://127.0.0.1:8080):

GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

Le serveur répond aux instructions de redirection (http://127.0.0.1:8080/login, définissez le champ d'en-tête de requête JSESSIONID):

HTTP/1.1 302 
Set-Cookie: JSESSIONID=D87025D753F0BF55732C58988D54F6D5; Path=/; HttpOnly
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Location: http://127.0.0.1:8080/login
Content-Length: 0
Date: Mon, 23 Sep 2019 03:31:48 GMT

3.2. Round 2, le client redirige la demande et le serveur répond à la page de connexion

Demande du client (http://127.0.0.1:8080/login):

GET /login HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br 
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=D87025D753F0BF55732C58988D54F6D5

Réponse du serveur (page de remplissage du formulaire d'authentification):

HTTP/1.1 200 
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: text/html;charset=UTF-8
Content-Length: 1406
Date: Mon, 23 Sep 2019 03:31:48 GMT

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">
    <title>Please sign in</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
    <link href="https://getbootstrap.com/docs/4.0/examples/signin/signin.css" rel="stylesheet" crossorigin="anonymous"/>
  </head>
  <body>
     <div class="container">
      <form class="form-signin" method="post" action="/login">
        <h2 class="form-signin-heading">Please sign in</h2>
        <p>
          <label for="username" class="sr-only">Username</label>
          <input type="text" id="username" name="username" class="form-control" placeholder="Username" required autofocus>
        </p>
        <p>
          <label for="password" class="sr-only">Password</label>
          <input type="password" id="password" name="password" class="form-control" placeholder="Password" required>
        </p>
<input name="_csrf" type="hidden" value="2a565ff3-f23f-441c-835c-668603d2e806" />
        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
      </form>
</div>
</body></html>

3.3 Le client client Round 3 remplit la connexion et l'authentification du serveur

Lorsque nous remplissons le nom d'utilisateur et le mot de passe, cliquez sur le bouton de connexion

Demande du client (accès: http://127.0.0.1:8080/login, les paramètres de la demande portent les champs du nom d'utilisateur et du mot de passe, et la chaîne aléatoire _csrf générée par le client)

POST /login HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Content-Length: 72
Cache-Control: max-age=0
Origin: http://127.0.0.1:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://127.0.0.1:8080/login
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=D87025D753F0BF55732C58988D54F6D5

username=test&password=123456&_csrf=2a565ff3-f23f-441c-835c-668603d2e806

La réponse du serveur (continuez à rediriger vers http://127.0.0.1:8080/ et mettez à jour le champ JSESSIONID dans l'en-tête de la requête):

HTTP/1.1 302 
Set-Cookie: JSESSIONID=D11354A13F7D0706F85900B7017F42B4; Path=/; HttpOnly
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Location: http://127.0.0.1:8080/
Content-Length: 0
Date: Mon, 23 Sep 2019 03:32:05 GMT

3.4. Demande de redirection du client Round 4 (cookie transportant des informations authentifiées), contenu de la réponse du serveur

Demande du client (127.0.0.1:8080, transportant le cookie: JSESSIONID)

GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://127.0.0.1:8080/login
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=D11354A13F7D0706F85900B7017F42B4

Réponse du serveur (contenu de 127.0.0.1:8080):

HTTP/1.1 200 
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: text/html;charset=UTF-8
Content-Length: 22
Date: Mon, 23 Sep 2019 03:32:05 GMT

hello, spring security

4 Post-scriptum

1. Voici un comportement logique pour l'apprentissage et la compréhension de certaines fonctions du cadre du point de vue de l'interaction de communication Il faut dire que WireShark est vraiment un outil d'analyse de la communication.
2. Spring security5 a quelques ajustements par rapport à la version précédente. Lors de la lecture de certains livres, les utilisations antérieures à la version 5.0 peuvent être utilisées dans les livres, et diverses anomalies peuvent être signalées lors de l'utilisation de la version supérieure, et certains ajustements doivent être apportés.

Je suppose que tu aimes

Origine blog.csdn.net/skytering/article/details/102388416
conseillé
Classement