Rust๋ก ๋ง๋ node.js์ฉ jsonwebtoken ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ ํํ ๊ธฐ์ต์ ์๋์ง๋ง Mozilla Servo๊ฐ ๋ฆด๋ฆฌ์ฆ ๋์์ผ๋ ์๋ง๋ 2016์ด ๋ง์๊ฑฐ ๊ฐ๋ค. ๊ทธ๋๋ ํ์ฐฝ ๋ํ๋ฏผ๊ตญ์ ์๋์ค๋ฌ์ด ๊ณต๊ตฐ ๋ณ์ฅ์ผ๋ก์ ๋น๋นํ ์ ๋ ์ผ๊ฐ ๊ทผ๋ฌด๋ฅผ ๋ง์น๊ณ ์ทจ์นจ ํ ์ฌ์ง๋ฐฉ์ ์์์ ๋์๋ค(ํน์ ์ฃผ๋ง์ด์ด์ ๋น๋ฒ์ด์๊ฑด?). ๊ณ๊ธฐ๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ด๋ค ์ด์ ๋ก Mozilla์์ Servo๋ผ๋ ์น ๋ธ๋ผ์ฐ์ ์์ง์ ์๋ก ๊ฐ๋ฐํ์๊ณ ์ด๋ Rust๋ผ๋ Mozilla์์ ๋ง๋ ์๋ก์ด ์ธ์ด๋ก ๊ฐ๋ฐ ๋๋ค๋ ๊ฒ์ ์๊ฒ๋์๋ค. ์ด์งธ์์์๊น? ์ด๊ฑด ๋ง์น ์ด๋ช
๊ฐ์ ๋ง๋จ์ด์์๊น? ๋๋ Rust ์ปจ์
์ ๋ณด๊ณ ๋ ๊ทธ๋๋ก ์ด ์ธ์ด์ ๋งค๋ฃ๋์๋ค.
๊ทธ ๋ค๋ก Rust ์ธ์ด์ ๋ํด์ ํํ ๋ฆฌ์ผ๊ณผ ๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ํ์ต์ ํ์ง๋ง ์ฐ๋ฆฌ๋๋ผ์์ ํ ๋งํ ํ๋ก์ ํธ๋ ์์๊ณ ๊ทธ ์ดํ๋ก Node.js๋ฅผ ์ ํ๋ฉด์ ์ด์ชฝ์ผ๋ก ๊ฐ๋ฐ๋ง ์งํํ๋ค ๋ณด๋ Rust๋ ๋ด ๋ง์ ์ ํ์ผ ์ ์๋ ์ง์ฌ๋ ๊ฐ์ ์กด์ฌ์๋ฌ๊น?
๊ทธ๋ ๊ฒ ์ค๋ ์๊ฐ์ด ์ง๋๊ณ ์ต๊ทผ Rust๋ก ๊ฐ๋ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์ฌ๋ฟ ์๊ฐ ๋๋ฉด์ ๋๋ ๋ค์ Rust๋ก ๊ฐ๋ฐ ํด๋ณด๊ณ ๋ง์์ด ์๊ตฌ์ณค๋ค.
๊ทธ๋์ ์ด๋ฒ์ ์ค์ฐํด๋ฅผ ๋ง์ ๊ฐ๋จํ ํ๋ก์ ํธ๋ฅผ ์ข ์งํํด๋ณด๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ โneonโ์ ์ด์ฉํด์ rust์์ ์ฌ์ฉํ๋ jsonwebtoken์ โnode-jsonwebtokenโ API ํธํ์ ๋ง์ถฐ node.js์ฉ์ผ๋ก ๋ง๋ค์ด๋ณด๊ธฐ๋ก ํ๋ค.
...
๊ทธ๋ฆฌ๊ณ ๋ง๋ค์๋ค! ๋-๋ฅ!
neon-jsonwebtokenโ
Installโ
ํ๊ธฐ์ ๋์ค๊ฒ ์ง๋ง ์์ฃผ ์์ ์ค์๋ก ๋ฐฐํฌ๊ฐ ์๋ผ์ 3์ผ์ ๋ฐฐํฌํ ์์ ์ด๋ค.
$npm i neon-jsonwebtoken
Featureโ
- Sign jsonwebtoken
- Decode jsonwebtoken
- Verify Jsonwebtoken
Dependencies and Environments Supportโ
- Neon
- Node.js version 12 and higher LTS
- Rust stable 1.18 and higher
Usageโ
์์ง Document๋ฅผ ๋ง๋ค ์๊ฐ์ด ์ถฉ๋ถํ์ง ์์๋ค. ๊ทธ๋ ์ง๋ง node-jsonwebtoken
๊ณผ ๋์ผํ API๋ฅผ ์ ์งํ๋ ค๊ณ ํ๋ค. ๊ตฌํ๋์ง ์์ ๋ถ๋ถ๋ง ํ์ธํ๋ค๋ฉด ์ฌ์ฉํ๋๋ฐ๋ ์ด๋ ต์ง ์์ ๊ฒ์ผ๋ก ์๊ฐํ๋ค. ๋ฌธ์๋ ์กฐ๋ง๊ฐ ์์ฑํ๋ ๊ฒ์ผ๋ก ํ๊ฒ ๋ค.
import * as jwt from 'neon-jsonwebtoken';
const token = jwt.sign(payload, key, signOptions);
const decodedPaylaod = jwt.decode(token, decodeOptions);
const paylaod = jwt.verify(token, key, verifyOptions);
To-Doโ
- Asynchronous
-
mutatePayload
option in sign function -
clockTolerance
,maxAge
,clockTimestamp
,nonce
options in veirfy function - Synchronize Error messages with
node-jsonwebtoken
Benchmarkโ
๊ฐ์ฅ ์ธ์์ ์ธ ๋ถ๋ถ์ Rust ์ํ๊ณ๋ฅผ ์ด์ฉํ์ฌ neon์ผ๋ก node.js์์ ์ฌ์ฉํ ์ ์๊ฒ ํฌํ ํ์ ๋ฟ์ธ๋ฐ ์ผ๋ฐ ๋ ธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋นํด ์ฑ๋ฅ์์ ๋ ์์๋ ์์น๊ฐ ๋์๋ค๋ ๊ฒ์ด๋ค.
ํ ์คํธ๋ ๊ฐ ํ์ผ๋ง๋ค 5๋ง๋ฒ์ iterator๋ฅผ ๊ฐ์ง๊ณ ์งํํ์๊ณ ํ ์คํธ๋ง๋ค 10ํ ์ฉ ๋ฐ๋ณตํ์ฌ ํ์ค ์๊ฐ๊ณผ ์ต์ฅ, ์ต๋จ ์๊ฐ์ ๊ตฌํ์๋ค.
ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ hyperfine์ ์ฌ์ฉํ์๋ค.
Sign tokenโ
node-jsonwebtoken์ jws์ ์์กด์ฑ์ ๊ฐ์ง๊ณ ์๊ณ callback์ ์ ๊ณตํ๋ค๋ฉด event stream์ผ๋ก ๋น๋๊ธฐ ์๋ต์ ์ ๊ณตํ๋ค.
neon-jsonwebtoken์ ์์ง ๋น๋๊ธฐ ์๋ต์ ๋ง๋ค์ง ์์๊ธฐ ๋๋ฌธ์ ํ
์คํธ ์ฝ๋์์ new Promise
๋ก ๋ํํด์ ํ
์คํธ ํด๋ณด์๋๋ฐ ๋๊ธฐ์ฝ๋๋ฅผ Promise๋ก ์์ ๋ฟ์ธ๋ฐ ํญ์ ๋ ๋น ๋ฅธ ์ฑ๋ฅ์ด ๋์จ ์ ์์ ์ดํดํ ์ ์์๋ค. ์ด์ ๋ํ์ฌ ์๋ฃ๊ฐ ์ถฉ๋ถํ์ง ์์๊ธฐ ๋๋ฌธ์ ์๋ ์ ๊ณตํ ๋ฐ์ดํฐ์์๋ ํ๊ธฐํ์ง ์์๋ค.
โฏ hyperfine "node ./node-jsonwebtoken.js" "node ./node-jsonwebtoken-async.js" "node ./neon-jsonwebtoken.js"
Benchmark 1: node ./node-jsonwebtoken.js
Time (mean ยฑ ฯ): 1.069 s ยฑ 0.042 s [User: 1.106 s, System: 0.074 s]
Range (min โฆ max): 1.019 s โฆ 1.135 s 10 runs
Benchmark 2: node ./node-jsonwebtoken-async.js
Time (mean ยฑ ฯ): 1.405 s ยฑ 0.032 s [User: 1.892 s, System: 0.203 s]
Range (min โฆ max): 1.367 s โฆ 1.476 s 10 runs
Benchmark 3: node ./neon-jsonwebtoken.js
Time (mean ยฑ ฯ): 661.7 ms ยฑ 22.4 ms [User: 629.1 ms, System: 52.1 ms]
Range (min โฆ max): 644.0 ms โฆ 705.9 ms 10 runs
Summary
'node ./neon-jsonwebtoken.js' ran
1.62 ยฑ 0.08 times faster than 'node ./node-jsonwebtoken.js'
2.12 ยฑ 0.09 times faster than 'node ./node-jsonwebtoken-async.js'
Decode tokenโ
decode์์๋ ํน์ดํ๊ฒ๋ node-jsonwebtoken
์ด ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ฌ์คฌ๋ค. ์ฌ๋ฌ ์ด์ ๋ฅผ ์๊ฐํด๋ดค์ง๋ง ์ด๊ฑฐ๋ค ํ๋ ์ด์ ๋ ์ฐพ์ง ๋ชปํ๋ค. ์ง์๊ฐ๋๊ฒ ์๋ค๋ฉด ์ ๋ณดํด์ฃผ์๋ฉด ์ข๊ฒ ๋ค.
โฏ hyperfine "node ./node-jsonwebtoken-decode.js" "node ./neon-jsonwebtoken-decode.js"
Benchmark 1: node ./node-jsonwebtoken-decode.js
Time (mean ยฑ ฯ): 1.464 s ยฑ 0.045 s [User: 1.520 s, System: 0.088 s]
Range (min โฆ max): 1.414 s โฆ 1.556 s 10 runs
Benchmark 2: node ./neon-jsonwebtoken-decode.js
Time (mean ยฑ ฯ): 1.630 s ยฑ 0.041 s [User: 1.701 s, System: 0.088 s]
Range (min โฆ max): 1.584 s โฆ 1.698 s 10 runs
Summary
'node ./node-jsonwebtoken-decode.js' ran
1.11 ยฑ 0.04 times faster than 'node ./neon-jsonwebtoken-decode.js'
Verify tokenโ
ํ ํฐ ๊ฒ์ฆ์์๋ ์คํ๋ ค ๋ ์ข์ ์ฑ๋ฅ์ด ๋ํ๋ฌ๋ค. ํ ์คํธ ์ฝ๋๋ HMAC ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์๋ง ํ๊ธฐํ๋๋ฐ ์ฐจํ ์๊ณ ๋ฆฌ์ฆ ๋ณ๋ก ๋ฒค์น๋งํฌ ์ฑ๋ฅ์ ํ๊ธฐํด์ผ๊ฒ ๋ค.
์ฐธ๊ณ ๋ก ํ
์คํธ ์ฝ๋์์๋ ๋์ผํ๊ฒ node-jsonwebtoken
์ด ํ ํฐ์ ๋ฐํํ ๋ก์ง์ด ํฌํจ ๋์ด์์ผ๋ฏ๋ก sign token์์ node-jsonwebtoken
์ด ๊ฑธ๋ฆฐ ์๊ฐ๋งํผ ๋นผ์ค์ผ ์ค์ง์ ์ธ ์๊ฐ์ด ๋ ๊ฒ ๊ฐ๋ค.
โฏ hyperfine "node ./node-jsonwebtoken-verify.js" "node ./neon-jsonwebtoken-verify.js"
Benchmark 1: node ./node-jsonwebtoken-verify.js
Time (mean ยฑ ฯ): 2.104 s ยฑ 0.080 s [User: 2.129 s, System: 0.111 s]
Range (min โฆ max): 2.003 s โฆ 2.295 s 10 runs
Benchmark 2: node ./neon-jsonwebtoken-verify.js
Time (mean ยฑ ฯ): 1.864 s ยฑ 0.118 s [User: 1.875 s, System: 0.104 s]
Range (min โฆ max): 1.751 s โฆ 2.120 s 10 runs
Summary
'node ./neon-jsonwebtoken-verify.js' ran
1.13 ยฑ 0.08 times faster than 'node ./node-jsonwebtoken-verify.js'
ํ๊ธฐโ
์ฝ ์ดํ์ ๊ฑธ์ณ์ ์์ฑํ๋๋ฐ Rust์์ ์ฌ์ฉ๋๋ jsonwebtoken๊ณผ serde serializer, neon์ ๋ํด์ ํ์ ํ๋๋ฐ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ ธ๋ค.
ํ์์๋ ํ์ฌ ์ผ๋ก ๋ฐ์๋ ์ค ์ฐํด ์ค์ ๋ง๋ฌด๋ฆฌ ์ง์ผ๋ ค๊ณ ์ฝ๋๋ฅผ ์ง๋ค๋ณด๋ ์ ๋ฆฌ๊ฐ ์๋ ๋ถ๋ถ๋ ๋ง์ด ์๋ค. ์์ง ๋ฌ์คํธ ํ๊ฒฝ์์ ์ฝ๋ ์ํคํ ์ณ๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ธ๊ฐ๋์ง๋ ํ์คํ๊ฒ ๋ชจ๋ฅด๊ฒ ๊ณ ์ฝ๋๋ ์ฐจ์ฐจ ๋ฆฌํฉํ ๋ง ํด๋ณด๋ ๊ฒ์ผ๋ก!
neon์ด ์๊ฐ๋ณด๋ค ํํ์ด์ง๊ฐ ๋ถ์คํ ๋ถ๋ถ์ด ์๋ค. ํํ์ด์ง์์๋ ์ด๊ธฐ ์ฌ์ฉ๋ฒ ์ ๋๋ง ์ฐธ๊ณ ํ๊ณ ๋๋จธ์ง๋ crate api ๋ฌธ์๋ฅผ ํ์ธํ๋ ํธ์ด ์ข๋ค.
npm publish
๋ฅผ ์๊ฐ์์ด ํ๋ค๊ฐ rust src๊น์ง ๊ฐ์ด ์ฌ๋ผ๊ฐ์ ์ทจ์ํ๊ณ ...
์๊ฐ์์ด .npmignore
์ src๋ง ์ถ๊ฐํด์ publish ํ๋ค๊ฐ cargo target ๋๋ ํ ๋ฆฌ๊ฐ ๋ธ๋ ค๊ฐ์ ๊ฐ์ ์ทจ์ํ๋๋ ์ด๋ฏธ ๋ฐฐํฌ๊ฐ ๋์ด๋ฒ๋ ธ๊ณ ...
์๊ฐ์์ด npm unpublish
๋ฅผ ํ๋ค๊ฐ ํ๋ฃจ๊ฐ ๋ฐฐํฌํ ์ ์๊ฒ ๋์๋ค... ์๋ง 2์ 3์ผ ์ค์ผ๋ก ๋ฐฐํฌ๋ ๋ฏํ๋ค...
์ฒซ ๋ฌ์คํธ ํ๋ก์ ํธ์ธ๋ฐ ์๊ฐ๋ณด๋ค ์ฌ๋ฐ์๋ค. ๊ทธ๋ฆฌ๊ณ trait์ด๋ผ๋ ๊ฐ๋ ์ด ๊ต์ฅํ ๋งค๋ ฅ์ ์ด๋ค.