์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Java
- java์ฑํ
- ์ค๋ธ์
- Personal Access Token
- db์ํคํ ์ณ
- ์ฝํ
- MySQL
- dockerhub
- ํฌ๋ก์ค์ฌ์ดํธ ์คํฌ๋ฆฝํธ
- Node.js
- ์ฝ๋ฉํ ์คํธ
- CICD
- SpringBoot
- oauth
- spring
- ์๋ฐ
- ๋ ผ๋ธ๋กํน
- injection๊ณต๊ฒฉ
- Jenkins
- GoogleLogin
- db์ ๋ต
- docker network
- React
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- spring scheduler
- node.js mysql ์ฐ๋
- ๋์์ธํจํด
- @scheduler
- ์๊ณ ๋ฆฌ์ฆ
- docker
- Today
- Total
<Hello Hosung๐/>
[Node.js] bcrypt ๋ก ํ์๊ฐ์ ๊ตฌํํ๊ธฐ ๋ณธ๋ฌธ
[Node.js] bcrypt ๋ก ํ์๊ฐ์ ๊ตฌํํ๊ธฐ
์ข์ถฉ์ฐ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ผ๊ธฐ๐ง 2024. 10. 15. 11:20
ํ์๊ฐ์ ์ ์ฌ์ฉ์๋ก๋ถํฐ ์์งํ ์์ด๋์ ๋น๋ฐ๋ฒํธ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง ์ด๋ ์ฃผ์ํ ์ ์ ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ํธํํ์ง ์๊ณ ํ๋ฌธ ๊ทธ๋๋ก ์ ์ฅํ ๊ฒฝ์ฐ์ ๋๋ค. ๋ง์ฝ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ์ถ๋๋ฉด, ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ํ๋ฌธ ๋น๋ฐ๋ฒํธ๋ฅผ ํตํด ์์ฝ๊ฒ ๋ก๊ทธ์ธํ๊ฑฐ๋ ๋ค์ํ ๊ณต๊ฒฉ์ ์๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์ ๋ณด์์ ๊ฐํํ๊ธฐ ์ํด ๋น๋ฐ๋ฒํธ๋ ์ํธํ(ํด์ฑ) ๊ณผ์ ์ ๊ฑฐ์ณ ์ ์ฅํด์ผ ํฉ๋๋ค. ํด์ฑ์ ํตํด ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํํ๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ถ ์์๋ ๋น๋ฐ๋ฒํธ ์๋ฌธ์ด ์๋ ํด์๊ฐ์ด ๋ ธ์ถ๋๋ฏ๋ก ๋ณด์์ ์ ์งํ ์ ์์ต๋๋ค.
์ค๋ ํฌ์คํ ์ bcrypt ๋ผ์ด๋ธ๋ฌ๋ฅผ ํ์ฉํ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ํธํํ์ฌ, ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋๋ก ํฉ์๋ค.
1) Node.js ํ๋ก์ ํธ์ bcrypt๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์น
npm install bcrypt
2) bcrypt๋ก ๋น๋ฐ๋ฒํธ ํด์ฑํ๊ธฐ
- ์ฝ๋ ์ค๋ช
1. bcrypt.hash(data.password, saltRounds): ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋น๋ฐ๋ฒํธ์ salt๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํฉ๋๋ค.
2. data.password = hashedPassword: ํด์๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฐ์ดํฐ์ ์ ์ฅํ์ฌ ํ ์คํธ ๋น๋ฐ๋ฒํธ ๋์ ์์ ํ ํ์์ผ๋ก ์ ์ฅํฉ๋๋ค.
์ด๋ ๊ฒ ํด์ฑํ ๋น๋ฐ๋ฒํธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ ํ๊ฒ ์ ์ฅํ ์ ์์ด, ํด์ปค๊ฐ ์๋ฒ์ ์ ๊ทผํ๋๋ผ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฝ๊ฒ ์์๋ผ ์ ์์ต๋๋ค.
const bcrypt = require("bcrypt");
const saltRounds = 10; // ํด์ ์๊ณ ๋ฆฌ์ฆ์ ๋ณต์ก๋ ์ค์
//ํ์๊ฐ์
const addUser = async (data) => {
console.log("data : ", data);
// ๋น๋ฐ๋ฒํธ ์ํธํ
const hashedPassword = await bcrypt.hash(data.password, saltRounds);
data.password = hashedPassword;
return await executeQuery("UserMapper", "insertUser", data);
};
3) bcrypt์ JWT๋ฅผ ํ์ฉํ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ
-์ฝ๋์ค๋ช
1. bcrypt.compare(data.password, user.PSWORD) : ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋น๋ฐ๋ฒํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ์ํธํ๋ ๋น๋ฐ๋ฒํธ(user.PSWORD)๋ฅผ ๋น๊ตํฉ๋๋ค. ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ๋ฉด ๋ก๊ทธ์ธ ์ฑ๊ณต์ผ๋ก ๊ฐ์ฃผํ๊ณ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋๋ค. ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด "๋น๋ฐ๋ฒํธ๊ฐ ๋ง์ง ์์ต๋๋ค"๋ผ๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค.
2. jwt.sign() : ๋ก๊ทธ์ธ์ด ์ฑ๊ณตํ๋ฉด jwt.sign() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ JWT ํ ํฐ์ ์์ฑํฉ๋๋ค. ์ด ํ ํฐ์ ์ฌ์ฉ์ ID๋ฅผ ๋ด์ ํ์ด๋ก๋์ secretKey๋ฅผ ๋ฐํ์ผ๋ก ์๋ช ๋๋ฉฐ, ์ ํจ๊ธฐ๊ฐ์ 1์๊ฐ(expiresIn: "1h")์ผ๋ก ์ค์ ๋ฉ๋๋ค.
const userLogin = async (data) => {
const res = await executeQuery("UserMapper", "selUserLogin", data);
if (res[0][0] != null) {
const user = res[0][0]; // DB์์ ๊ฐ์ ธ์จ ์ฌ์ฉ์ ์ ๋ณด
const isPasswordCorrect = await bcrypt.compare(data.password, user.PSWORD);
if (isPasswordCorrect) {
// JWT ํ ํฐ ์์ฑ
const token = jwt.sign({ userId: data.userId }, secretKey, {
expiresIn: "1h",
}); // userId๋ฅผ ํ์ด๋ก๋์ ๋ด๊ณ ์ ํจ๊ธฐ๊ฐ 1์๊ฐ ์ค์
return {
code: "200",
token, // ํ ํฐ ๋ฐํ
};
} else {
return { code: "400", msg: "๋น๋ฐ๋ฒํธ๊ฐ ๋ง์ง ์์ต๋๋ค." };
}
} else {
return { code: "400", msg: "๋ฑ๋ก๋ ์ด๋ฉ์ผ ์ ๋ณด๊ฐ ์์ต๋๋ค." };
}
};
๋ง๋ฌด๋ฆฌ
์ด๋ฒ ํฌ์คํ ์์๋ Node.js ํ๊ฒฝ์์ bcrypt์ JWT๋ฅผ ํ์ฉํ์ฌ ์์ ํ ์ฌ์ฉ์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์์ต๋๋ค. ๋น๋ฐ๋ฒํธ ํด์ฑ๊ณผ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์์ ์ธ ๋ณด์ ์์๋ก, ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ณดํธํ๋ ๋ฐ ํฐ ์ญํ ์ ํฉ๋๋ค.
์์ผ๋ก๋ ๋ณด์์ ์ ๊ฒฝ ์ฐ๋ฉฐ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ๋ณดํธํ๋ ๋ฐฉ๋ฒ์ ๊ณ์ํด์ ์ฐ๊ตฌํ๊ณ ์ ์ฉํด ๋๊ฐ๊ธธ ๋ฐ๋๋๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ์์ด ๋ณด์์ ์ ํ์ด ์๋ ํ์์์ ํญ์ ๊ธฐ์ตํด ์ฃผ์ธ์.
์ด ๊ธ์ด ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฉฐ, ๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์. ๊ฐ์ฌํฉ๋๋ค!
'๐ฑ JavaScript > ใ คNode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Node.js] OAuth2 ๋ก๊ทธ์ธ - 2(Google Login) (1) | 2024.11.19 |
---|---|
[Node.js] OAuth2 ๋ก๊ทธ์ธ - 1 (0) | 2024.11.18 |
[Node.js] Express ์๋ฒ๋ฅผ ๋ง๋ค์ด ๋ณด์ (0) | 2024.09.24 |
[Node.js] Node.js(Express) โ๏ธ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๐ฆ ์ฐ๋ํ๊ธฐ (0) | 2024.09.23 |