春のセキュリティの簡単なプロジェクトの作成と、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より前になる場合があり、より高いバージョンを使用するとさまざまな異常が報告される場合があり、いくつかの調整が必要です。