春のセキュリティの簡単なプロジェクトの作成と、wiresharkキャプチャに基づくブラウザ側とサーバー側の間の通信相互作用の分析

1.環境

Springツールスイート:バージョン:4.1.2.RELEASE統合開発ツール
Maven:3.5.4依存関係管理ツール
Springboot :2.1.4。RELEASEWireshark
:バージョン2.4.5通信プロトコルパケットキャプチャ分析ツール
HTTPリクエストエディタ:V1.0HTTPリクエストシミュレーションツール
GoogleChrome:74.0.3729.169(公式バージョン)(32ビット)Googleブラウザー
Microsoft Edge:44.18362.329.0Microsoftブラウザー

2.簡単な春のセキュリティプロジェクトを作成します

2.1。プロジェクトを作成するためのウィザード

ここに写真の説明を挿入

ここに写真の説明を挿入
注:この手順では2.1.4を選択してください。そうしないと、pom.xmlの最初の行にエラーが発生する可能性があります。

ここに写真の説明を挿入
クリックすると、ステータスバーにダウンロードテンプレートとプロジェクトスケルトンの生成の進行状況が表示されます
ここに写真の説明を挿入

pom.xmlをチェックして、次の依存関係が自動的に導入されることを確認します。
ここに写真の説明を挿入
その中で、セキュリティに関連する2つの依存関係は次のとおりです。

<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簡単なコントローラーメソッドを作成する

@RestController
@SpringBootApplication
public class Springsecuritytest001Application {
    
    

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

}

自動的に作成されたSpringsecuritytest001Applicationクラスにrestapiを追加します

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

そして、クラスレベルで注釈
@RestControllerを追加します

2.3。テスト実行

ここに写真の説明を挿入
コンソールはhttpのデフォルトユーザー(ユーザー)のパスワードを生成します。
ブラウザーを使用して127.0.0.1:8080にアクセスすると、ログインページにジャンプします。
ここに写真の説明を挿入

ユーザー名userと、フロントコンソールに印刷されているランダムなパスワードを使用して入力し、[ログイン]をクリックします
ここに写真の説明を挿入
ここに写真の説明を挿入

2.4構成ファイルを使用してHTTP認証のユーザー名とパスワードを構成します


spring.security.user.name = test
spring.security.user.password = 123456
application.propertiesファイルに追加して再実行します。この時点で、コンソールはランダムなパスワードを生成しなくなります。
ブラウザアクセス:
ここに写真の説明を挿入
ここに写真の説明を挿入

3ワイヤーシャークパケットキャプチャ分析

ここに写真の説明を挿入
ご覧のとおり、4ラウンドのリクエストとレスポンスがあります

3.1。ラウンド1クライアント要求、サーバーリダイレクトログイン

クライアントリクエスト(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

サーバーはリダイレクト命令に応答します(http://127.0.0.1:8080/login、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。ラウンド2クライアントはリクエストをリダイレクトし、サーバーはログインページに応答します

クライアントリクエスト(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

サーバーの応答(認証フォーム入力ページ):

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ラウンド3クライアントクライアントがログインとサーバー認証を入力します

ユーザー名とパスワードを入力したら、ログインボタンをクリックします

クライアントリクエスト(アクセス:http://127.0.0.1:8080 / login、リクエストパラメータにはユーザー名とパスワードのフィールドがあり、クライアントによって生成された_csrfランダム文字列)

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

サーバーの応答(引き続きhttp://127.0.0.1:8080/にリダイレクトし、要求ヘッダーのJSESSIONIDフィールドを更新します):

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。ラウンド4クライアントリダイレクト要求(認証された情報を運ぶCookie)、サーバー応答コンテンツ

クライアントリクエスト(127.0.0.1:8080、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

サーバーの応答(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追記

1.ここでは、通信の相互作用の観点からいくつかのフレームワーク機能を学習および理解するための論理的な動作を示します。wiresharkは実際には通信分析ツールであると言わなければなりません。
2. Spring security5には、以前のバージョンからいくつかの調整があります。一部の本を読む過程で、本の使用が5.0より前になる場合があり、より高いバージョンを使用するとさまざまな異常が報告される場合があり、いくつかの調整が必要です。

おすすめ

転載: blog.csdn.net/skytering/article/details/102388416