๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ๏ธ 21-2 IPP/Node.js study

Node.js - 19 ํŒจ์Šค์›Œ๋“œ ํ•ด์‹ฑ, ์œ ํšจ์„ฑ ๋ฏธ๋“ค์›จ์–ด

by hanwitjus 2021. 11. 9.

ํŒจ์Šค์›Œ๋“œ์˜ ํ•ด์‹ฑ

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์— ํŒจ์Šค์›Œ๋“œ๊ฐ€ ํ‰๋ฌธ ๊ทธ๋Œ€๋กœ ์ €์žฅ๋˜๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  ํ•ด์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋กœ ๋Œ€์‹  ์ €์žฅํ•˜๊ฒŒ ํ•˜์—ฌ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•ด์ค€๋‹ค. 

 

์˜ค๋ผํด DB๋กœ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ DB์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•˜๋Š”๋ฐ, Node.js์— ๋‚ด์žฅ๋˜์–ด์žˆ๋Š” ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ 1์ฐจ์ ์œผ๋กœ ๋ณด์•ˆ๊นŒ์ง€ ์‹ ๊ฒฝ์จ์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฒŒ ๋ญ”๊ฐ€ ์ข‹๋‹ค.

 

์ด๋ฅผ ์œ„ํ•ด 

bcrypt ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

bcrypt : ํŒจ์Šค์›Œ๋“œ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ์‹œ ๊ณ ์œ ํ‚ค์™€ ์กฐํ•ฉํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

 

1) npm i bcrypt@3.0.0 -S ์œผ๋กœ ์„ค์น˜

ํ•˜๋ผ ๊ทธ๋ž˜์„œ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ๋Š”๋ฐ ์„ค์น˜๊ฐ€ ์•ˆ๋ผ์„œ Warning ๋ฌธ๊ตฌ ํ™•์ธํ•ด๋ณด๋‹ˆ๊นŒ 5.0.0 ๋ฒ„์ „ ์ด์ƒ์œผ๋กœ ์„ค์น˜ํ•˜๋ผ๊ณ  ํ•ด์„œ ๊ทธ๋ƒฅ ์ž„์˜๋กœ ์ผ๋‹จ

npm i bcrypt@5.0.0 -S ์œผ๋กœ ์„ค์น˜ํ–ˆ๋‹ค.

 

2) ํ•ด์‹ฑ์„ ์ง„ํ–‰ํ•ด์•ผํ•  ๋ชจ๋“ˆ์—์„œ bcrypt ๋ชจ๋“ˆ ์š”์ฒญ/ํ•ด์‹ฑ์ฝ”๋“œ ์ž‘์„ฑ

ํ•ด์‹ฑ์€ Controller์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ชจ๋ธ์—์„œ Mongoose์˜ pre-save ํ›…์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

(+ Mongoose์˜ pre ํ˜น์€ post ํ›…์€, ์‚ฌ์šฉ์ž๊ฐ€ DB์— ์ €์žฅ๋˜๊ธฐ ์ „/ํ›„๋กœ User ์ธํ„ฐํŽ˜์ด์Šค์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.)

 

๊ทธ๋ž˜์„œ user.js ๋ชจ๋ธ ๋ชจ๋“ˆ์— ๋จผ์ €

const bcrypt = require("bcrypt");๋กœ ์š”์ฒญํ•œ๋‹ค์Œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด์‹ฑ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

/models/user.js

 

๋จผ์ € 63ํ–‰์ฒ˜๋Ÿผ preํ›…์„ userSchema์— ์ถ”๊ฐ€ํ•œ๋‹ค. 

66ํ–‰์˜ bcrypt.hash ๋ฉ”์†Œ๋“œ๋Š” ํŒจ์Šค์›Œ๋“œ์™€ ์ˆซ์ž๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค.

์ˆซ์ž๋Š” ํŒจ์Šค์›Œ๋“œ ํ•ด์‹ฑ์—์„œ์˜ ๋ณต์žก๋„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ๋ณดํ†ต 10์„ ์ค€๋‹ค.

ํ•ด์‹ฑ์ด ์™„๋ฃŒ๋˜๋ฉด ํ”„๋ผ๋ฏธ์Šค ์ฒด์ธ์˜ ๋‹ค์Œ ๊ฒฐ๊ณผ์ธ hash(ํ•ด์‹œ๋œ ํŒจ์Šค์›Œ๋“œ)๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

hash๋ฅผ ์‚ฌ์šฉ์ž ํŒจ์Šค์›Œ๋“œ์— ํ• ๋‹นํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•œ๋‹ค.

 

76ํ–‰์— passwordComparison์€ userSchema์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”์†Œ๋“œ๋กœ ์ •์˜ํ–ˆ๋‹ค.

ํผ์—์„œ ๋ฐ›์•„์˜จ password ๊ฐ’๊ณผ ํ•ด์‹ฑ๋œ ํŒจ์Šค์›Œ๋“œ๋ฅผ ๋น„๊ตํ•œ๋‹ค.

๋น„๋™๊ธฐ๋กœ ์ด ๊ณผ์ •์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ bcrypt๋กœ ํ”„๋ผ๋ฏธ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

bcrypt.compare๋Š” ์‚ฌ์šฉ์ž์˜ ํŒจ์Šค์›Œ๋“œ์™€ inputPassword์™€์˜ ๋น„๊ต ๊ฒฐ๊ณผ๋ฅผ ์ฐธ/๊ฑฐ์ง“์œผ๋กœ ๋Œ๋ ค์ฃผ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ๋†“๊ณ  ์ด์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

 

userController.js

 

์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ, ์ œ๋Œ€๋กœ ๋Œ์•„๊ฐ€์ง€ ์•Š์•„์„œ ์ˆ˜์ •์ค‘์ด๋‹ค. (2021.11.09 16:45)

 

 

์ผ๋‹จ DB์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ชจ์Šต์„ ๋ณด๋ฉด,

 

 

id/password๋ฅผ chun/chun์œผ๋กœ ํ•ด์„œ ๋“ฑ๋กํ–ˆ๋Š”๋ฐ ์ €๋ ‡๊ฒŒ ํŒจ์Šค์›Œ๋“œ๋Š” ํ•ด์‹ฑ๋œ ๊ฐ’์ด ์ €์žฅ๋œ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทผ๋ฐ ์ €๋ ‡๊ฒŒ ์ด๋ฉ”์ผ์„ ๋ณด๋ฉด validator๋ฅผ ์ ์šฉํ–ˆ๋Š”๋ฐ๋„ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์ด๋ฉ”์ผ ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋๋‹ค...ใ…Ž

 

 

 

express-validator๋กœ ์œ ํšจ์„ฑ ์ฒดํฌ ๋ฏธ๋“ค์›จ์–ด ์ถ”๊ฐ€

 

express-validator๋Š” ์œ ์ž… ๋ฐ์ดํ„ฐ๊ฐ€ ํŠน์ • ํ˜•์‹์„ ๋”ฐ๋ฅด๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด ์›ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 

npm i express-validator -S ๋ช…๋ น์œผ๋กœ ์„ค์น˜ํ•œ๋‹ค.

 

์œ ํšจ์„ฑ์„ ์ฒดํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” validator์™€ sanitizer๊ฐ€ ์žˆ๋Š”๋ฐ,

  • Validator(๋ฐธ๋ฆฌ๋ฐ์ดํ„ฐ) : ์œ ์ž… ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์ • ๊ธฐ์ค€์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ์ฒดํฌ (๋ฐ์ดํ„ฐ ํ’ˆ์งˆ ์ฒดํฌ)
  • Sanitizer(์ƒˆ๋‹ˆํƒ€์ด์ €) : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ €์žฅํ•˜๊ธฐ ์ „์— ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ ์‚ญ์ œ๋‚˜ ํƒ€์ž… ์บ์ŠคํŒ… ์ˆ˜ํ–‰ (๋ฐ์ดํ„ฐ ์ •๋ฆฌ)

 

registerController.js

 

ํšŒ์›๊ฐ€์ž… ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” registerController.js์— express-validator๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. 

์ด๋ฉ”์ผ์ด ํ˜•์‹์— ๋งž๋Š”์ง€, ํŒจ์Šค์›Œ๋“œ ํผ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  getValidationResult์—์„œ ์œ ํšจ์„ฑ ์ฒดํฌ ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค์Œ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

์ฑ…์— ๋‚˜์™€์žˆ๋Š” ๋Œ€๋กœ ๋‹ค ์ž˜ ์ง ๊ฒƒ ๊ฐ™์€๋ฐ, ์œ ํšจ์„ฑ ๊ฒ€์ฆ์ด ์ž˜ ์•ˆ๋จนํžŒ๋‹ค... ๋‚ด์ผ ๋‹ค์‹œ ๊ณ ์ณ๋ด์•ผ๊ฒ ๋‹ค.

 

 

์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š”๋ฐ, ์ธํ„ฐ๋„ท์— ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด ์ €๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š”๊ฒŒ ๋ชจ๋“ˆ์˜ ๋ฒ„์ „์ฐจ์ด์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ณ„์† uninstallํ•˜๊ณ  ๋‹ค์‹œ ๊น”๊ณ  ๋ฐ˜๋ณตํ•˜๋Š”๋ฐ๋„ ์•ˆ๊ณ ์ณ์ ธ์„œ ํฌ๊ธฐํ–ˆ๋‹ค... ๋’ค์— passport๋ผ๋Š” ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด์„œ ๋˜ ์ด๋Ÿฐ ๋น„์Šทํ•œ ๊ฒ€์ฆ์„ ํ•˜๋Š”๊ฒŒ ์žˆ๋˜๋ฐ ๊ทธ๊ฑธ๋กœ ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

 

 

 

LIST

๋Œ“๊ธ€