Introduction
Fuzzing Test๋ฅผ ํ๊ณ ์ถ์๊ฐ์? ์๋๋ฉด ์๋ฒ์ ๋ถํ๋ฅผ ํ ์คํธํ๊ณ ์ถ์๊ฐ์? ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด์ ํ๋์ ๋ณด๊ณ ์ถ์๊ฐ์?
์ด๋ฅผ ์ํ HTTP Benchmark Tool์ธ gotybench๋ฅผ ์ค๊ณํ์ต๋๋ค!
- gotybench ๋ ์๋์ผ๋ก json object๋ฅผ ๋๋คํ๊ฒ ์์ฑํ์ฌ HTTP.post ํ๋ HTTP Benchmark Tool์
๋๋ค.
github link : https://github.com/ghkdqhrbals/gotybench
- gotybench๋ ๋ค์์ ๋ชฉํ๋ก ์ค๊ณ ๋ฐ ์ ์ํ์์ต๋๋ค.
- ํ
์คํธ ๋์์ฑ ๋ณด์ฅ : goroutine ๊ฒฝ๋ ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์์ผ๋ฉฐ, ์ฑ๋์ ํตํด ํต์ ํ๋๋ก ์ค์ ํ์์ต๋๋ค. ๊ธฐ๋ณธ net/http ๋ฅผ ์ฌ์ฉํ๊ธฐ๋๋ฌธ์ ์์ฒญ/์๋ต์ Blocking ์ผ๋ก ์งํ๋๋ฉฐ ๋๋จธ์ง ์ฒ๋ฆฌ๋ ์ฑ๋์ ํตํด ๋น๋๊ธฐ๋ก ์งํ๋ฉ๋๋ค. ๋ง์ ์์ ์ค๋ ๋๋ฅผ ๋๋ฆฌ๊ธฐ์ Thread-safe ํ๊ฒ ์ค๊ณํด์ผํฉ๋๋ค. ๊ทธ๋์
HandleResponse
๋ฅผ ๋จ์ผ ์ค๋ ๋๋ก ๋๋ฆฌ๊ณ , ์ฑ๋์ ํตํด ๋ค๋ฅธ ์ค๋ ๋๋ก๋ถํฐ์ ์๋ต์ ๊ฐ์ ธ์์ ์ค๋ ๋ stack ์์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณํ์์ต๋๋ค! - ๋ค์ด๋๋ฏน Structure ์ ํตํ Fuzzed Json ์ค๋ธ์ ํธ ์์ฑ : ์ฌ์ฉ์๊ฐ key์ value type๋ค๋ง ์ค์ ํด์ฃผ๋ฉด ์๋์ผ๋ก ๋๋คํ json ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋๋ก ์ ์ํ์์ต๋๋ค.
- ex) โgotybench -j [userId,string,userAge,int]โ : userId์ value๋ฅผ ๋๋คํ string์ผ๋ก ์ค์ ํฉ๋๋ค. ๋ํ userAge์ value๋ฅผ ๋๋คํ int๋ก ์ค์ ํฉ๋๋ค.
- ๋ฒค์น๋งํฌ ๋ก๊ทธ ์๋ฒ ๊ฐ์ค : ์๋ต RTT๋ฅผ ์๊ฐ ์๋ฆฌ์ฆ๋ก ํ์ธํ ์ ์๋ ๊ทธ๋ํ ๋ฐ ๊ธฐํ ์ ๋ณด๋ค์ ์ ์ฅํ๋ ๋ก์ปฌ์๋ฒ๋ฅผ ์คํํ์ต๋๋ค. (Open Port :8022)
Options
Option | Detail |
---|---|
-c | ๋์์ฒ๋ฆฌ๊ฐ๋ฅํ ์ค๋ ๋ ๊ฐ์๋ฅผ ํด๋น ์ต์ ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. |
-h | ์ต์ ๋ค์ ์ค๋ช ์ ํ์ธํ ์ ์์ต๋๋ค. |
-j | ํต์ฌ์ ์ธ Fuzzing ๊ธฐ๋ฅ์
๋๋ค. json object๋ฅผ ํด๋น ์ต์ ์ผ๋ก key/type์ ์ค์ ํ๋ฉด, ๋๋คํ value์ json obejct๊ฐ ์์ฑ๋ฉ๋๋ค. Fuzzing์ด ์ง์๋๋ type ์ 4๊ฐ์ง๋ก ์๋์ ๊ฐ์ต๋๋ค. int, float, string, boolean Usage Example ex) -j "[userId,string,userAge,int]" |
-r | HTTP POST request ๊ฐ์๋ฅผ ํด๋น ์ต์ ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. |
-t | ๋ฒค์น๋งํฌ ํด๋ผ์ด์ธํธ์ network connection ์ timeout์ ํด๋น ์ต์ ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. |
-u | ์์ฒญํ๋ URL์ ์ค์ ํ ์ ์์ต๋๋ค. |
-s | ๋ก๊น ๋ ์ด์ ๋ฒค์น๋งํฌ ๋ฐ์ดํฐ ๋ฐ ๊ทธ๋ํ๋ค์ ์๋ฒ์ ๋์๋๋ค. |
์ด์ค ํนํ -j
์ต์
์ Dynamic Struct๋ฅผ ์ฐจ์ฉํจ์ผ๋ก์จ, ์ค๋ธ์ ํธ์ private ํ๋๋ ์ฌ์ฉ์์ ์
๋ ฅ๊ฐ์ ๋ฐ๋ผ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค!
Before we started, we need to get โฆ
- run
go get github.com/fatih/color
for coloring your terminal - run
go get -v github.com/gosuri/uilive
for updating process - run
go get -u github.com/go-echarts/go-echarts/v2/...
to see graph with responses in timeseries. - run
go get github.com/ompluscator/dynamic-struct
to dynamically add field of json structs.
Usage
run
go run main.go
in your terminal and see optionsAlloc = 0 MiB TotalAlloc = 0 MiB Sys = 8 MiB NumGC = 0 Properties - Max parallelism : 8 Usage of /var/folders/h0/_d_zrr0j57x8wmknjb1r6hfm0000gn/T/go-build3252492082/b001/exe/main: -c int ์ค๋ ๋ ๊ฐ์ (default 100) -j string Json "[KEY1,TYPE1,KEY2,TYPE2,...]" -r int ์์ฒญ ๊ฐ์ (default 10000) -t int ์์ฒญ ํ์์์(second) (default 30) -u string URL -s Opening Log Server
choose your options and run
Example
$ go run main.go -j "[userId,string,userPw,string,mail,string,userName,string]" -r 10000 -c 1000 -u http://127.0.0.1:8080/auth/user
[Properties]
- Max parallelism : 8
- Request url : http://127.0.0.1:8080/auth/user
- The number of HTTP Requests : 10000
- The number of threads : 100
Listening server's response .. (10000/10000)
[Results]
---------------------------------------------------------
| Response Status | Count | Percent |
| 200 | 10000/10000 | 100.0% |
---------------------------------------------------------
- Average response time : 110.66 ms
- Max response time : 770.32 ms
- Min response time : 21.46 ms
[Memory Usage]
- Heap size = 2 MB
- Cumulative Heap size = 161 MB
- All goroutine size = 22 MB
- GC cycle ํ์ = 48
Finished! ( Total Elapsed Time : 11.4659 seconds )
Now you can see response time series graph in local machine => http://localhost:8022