-
Authorization Systemit's me/๐ฉ๐ป ํ๋ก์ ํธ ์ ๋ฆฌ 2020. 1. 15. 01:02
์ฌ์ค ํ๋ก์ ํธ๋ฅผ ๋ค ๋๋ธ ํ ํ๊บผ๋ฒ์ ๋ฉ์ฐ๊ฒ ์ ๋ฆฌํ๊ณ ์ถ์์ง๋ง,,
๊ทธ๋ฌ๊ธฐ์ ๋๋ฌด ์์ด ๋ง์ ๊ฒ ๊ฐ์์
์ด๋๊น์ง ์งํํ ๋ถ๋ถ ๋ถ๋ถ ์ ๋ฆฌํด์ ์ฌ๋ฆฌ๊ธฐ๋ก ํ๋ค.
๊ธฐ๋ณธ์ํคํ ์ณ
client (react) ↔ server (node.js) ↔ mysql (db) ์บ์์ฒ๋ฆฌ Redis
Node.js ์์ mysql ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผ ๋ฐฉ๋ฒ
- connection ๊ฐ์ฒด ์์ฑํ์ฌ ๊ทธ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด DB์ ํต์
- connection ์ค์ ์ config ํด๋ ๋ด์ ์ ์ฅ
3. connection ์์ฑํ๋ ๋ฐฉ๋ฒ
createConnection()
- ๋งค๋ฒ connection ์์ฑ → ๋นํจ์จ์ (์์ฑ๋ ๋ ๋ง์ ์๊ฐ ์์๋๊ธฐ ๋๋ฌธ)
- createConnection() ๋ฉ์๋๋ฅผ ํตํด connection ๊ฐ์ฒด ํ๋ ์์ฑ
- ์ข ๋ฃ: connection.end();
createPool()
- createPool() ๋ฉ์๋๋ฅผ ํตํด connection pool ์์ฑ
- connection ์ pool ์์ ๊ฐ์ ธ์ ์ฌ์ฉ ⇒ createConnection() ๋ณด๋ค ํจ์จ์
- connection์ ๊ฐ์ ์ ํ 0 ⇒ ๋ฐํํด์ฃผ์ง ์์ ๊ฒฝ์ฐ connection limit ์ ๊ฑธ๋ฆด ์ ์๋ค.
- connection ๋ฐํ : connection.release();
4. connection ์ฌ์ฉ ํ ๋ฐ๋์ end(), release() ์ด์ฉํด connection ๋์ด์ผ ํ๋ค.
=> end(), release() ๋น๋๊ธฐ๋ก ์ํ ⇒ connection.query()์ callback ํจ์ ๋ด์ ์์ฑ
5. connection ์ฌ์ฉ ๋ฐฉ๋ฒ
-
query ๋ฌธ์ string, values ๋ query ๋ฌธ์ ๋ค์ด๊ฐ ๋์ ์ผ๋ก ํ ๋น๋ ๋ณ์
-
select ๊ฒฐ๊ณผ ๊ฐ : [{object1}, {object2}, {object3},...] → ํน์ object ์ ๊ทผ ์ result[i].value
-
insert/ update / delete ์ ๊ฒฐ๊ณผ ๊ฐ : ๊ฒฐ๊ณผ ๊ฐ์ด ๋ด๊ธด json ๊ฐ์ฒด
-
Node.js Password Encryption
์ํธํ๋ฅผ ์ํด crypto ๋ชจ๋ ์ฌ์ฉ
pbkdf2 - ๋จ๋ฐฉํฅ์ํธํ
hash : ํด์ ์๊ณ ๋ฆฌ์ฆ ( ex sha256, sha512 ...) → ๋ฌธ์์ด์ ํน์ ๊ท์น์ ์ด์ฉํด ๋ค๋ฅธ ๋ฌธ์์ด๋ก ์นํ
salt : ํด์ฑ์ ํ ๋ ์ถ๊ฐ๋๋ ์์์ ๋ฌธ์์ด ( salt๋ฅผ ํด์ฑํ ๋ฌธ์์ด์ ์ถ๊ฐํ์ฌ ํด์ฑํ๋ ๊ฒ : salting)
⇒ ๋ ๊ฐ๋ ฅํ๊ฒ ์ํธํ ์ํฌ ์ ์๋ค.
const salt = await crypto.randomBytes(32);
key stretching : hashing ํจ์๋ฅผ ๋ฐ๋ณตํ์ฌ ํด์ฑํ๋ ๊ฒ.
salt ๊ฐ์ ์๋๋ผ๋ ๋ฐ๋ณตํ์๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด digest ๋ฅผ ์ฐพ์ ์ ์๋ค. ( digest : salt + password string )
๋จ์ ํด์ฑ์ 1์ด์ ์๋ง ~ ์์ญ์ต๊ฐ์ Digest ์์ฑ๊ฐ๋ฅ
-> GPU๋ฅผ ์ฌ์ฉํ brute-force ๊ณต๊ฒฉ์ ์ฝ๊ฒ ๋ซ๋ฆฐ๋ค! ⇒ salting + key stretching ํจ๊ป ์ฌ์ฉ
// password encryption ๊ฒฐ๊ณผ const pwHashed = await crypto.pbkdf2(user_pw, salt.toString('base64'), 10000, 32, 'sha512');
Node.js ํ ํฐ
Token ๊ธฐ๋ฐ ์ธ์ฆ
์๋์๋ฆฌ : Statelsess ์๋ฒ
ํด๋ผ์ด์ธํธ ↔ ์๋ฒ ๊ฐ์ ์ํ ์ ์ง ํ์ง ์๋๋ค.
( ์ฆ , ์๋ฒ๋ ํด๋ผ์ด์ธํธ ์ธก์์ ๋ค์ด์ค๋ ์์ฒญ๋ง์ผ๋ก ์์ ์ ์ฒ๋ฆฌ )
⇒ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ ์๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ํ์ฅ์ฑ ↑
Token์ ์ฌ์ฉํ๊ฒ ๋ ์ด์ ?
์์ ์ ๊ธฐ์กด ์ธ์ฆ ์์คํ ์์๋ ์๋ฒ ์ธก์์ ์ ์ ๋ค ์ ๋ณด ๊ธฐ์ตํ๊ณ ์์๋ค. (์ธ์ )
→ ๋ก๊ทธ์ธ ์ ์ ์ ์ ๋์ด๋๋ฉด ์๋ฒ ๋จ ๊ณผ๋ถํ ๋ฌธ์ / ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ๋ฌธ์ / ์๋ฒ ํ์ฅ ์ด๋ ค์
Token : ์ํธํ ๋ ์ ๋ณด ์ค๊ณ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ณด์ ์ธก๋ฉด์์ ์์ + ์๋ฒ์ ๋ถ๋ด X
JWT ( JSON Web Token )
JSON ํฌ๋งท์ผ๋ก ํต์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ค Client ์์๋ Data ํต์ ์ JSON ์ด์ฉํ๋ฉด ํ ํฐ ์ฌ์ฉ๊ฐ๋ฅ
๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ( C, Java, Python, C++, R, C# ... ๋ฑ) ์์ ์ง์
์๊ฐ ์์ฉ์ : JWT ๋ ํ์ํ ๋ชจ๋ ์ ๋ณด ์์ฒด์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ค. ⇒ ๊ฒ์ฆ๋ signature ํฌํจ / ์ฝ๊ฒ ์ ๋ฌ ๊ฐ๋ฅ
JWT ๊ธฐ๋ณธ ๊ตฌ์ฑ
— ํค๋ ( Header ) : JWT ์น ํ ํฐ์ ํค๋ ์ ๋ณด
typ : ํ ํฐ์ ํ์ , JWT ๋ง ์กด์ฌ
alg : ํด์ฑ ์๊ณ ๋ฆฌ์ฆ ( HMAC SHA256, RSA ) ํค๋๋ฅผ ์ํธํ ํ๋ ๊ฒ X → ํ ํฐ ๊ฒ์ฆ ์ ์ฌ์ฉ
— ์ ๋ณด( Payload ) : ์ค์ ํ ํฐ์ผ๋ก ์ฌ์ฉํ๋ ค๋ ๋ฐ์ดํฐ๊ฐ ๋ด๊ธฐ๋ ๋ถ๋ถ
— ์๋ช ( Signature ) : Header ์ Payload ์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ๋ณ์กฐ ๋ฐฉ์ง๋ฅผ ์ํ ์๋ช
Header ์ Payload ์ ์ธ์ฝ๋ฉํ ๊ฐ์ ํฉ์น ํ, Secret ํค ์ ํจ๊ป Header์ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ธ์ฝ๋ฉ
JWT ๊ตฌ์กฐ : [ Header Payload Signature ] ๊ฐ๊ฐ JSON ํํ์ ๋ฐ์ดํฐ๋ฅผ base64 ์ธ์ฝ๋ฉ ํ ํฉ์น๋ค.
aaaaaaa.bbbbbbbb.cccccccc . ์ ์ด์ฉํด ํฉ์น๋ค.
node.js ์์ jsonwebtoken ๋ชจ๋ ํ์ฉ
- ์ฃผ์ ๋ฉ์๋
jwt.sign(payload, secretKey, option)
secretKey : ์์์ ๋ฌธ์์ด, ๋๋ค์ผ๋ก ๋ง๋ค์ด ์๋ฒ๊ฐ ๊ฐ์ง๊ณ ์์
option : ์๊ณ ๋ฆฌ์ฆ, Token ์ ํจ๊ธฐ๊ฐ
jwt.verify(token, secretKey)
//jwt ๋ชจ๋๋ก ๋ง๋ค์ด์ ํ์ฉ module.exports = { sign : function(_id) { const options = { algorithm : "HS256", expiresIn : 60 * 60 * 24 * 30 //30 days }; const payload = { _id : _id }; let token = jwt.sign(payload, secretKey, options); return token; }, verify : function(token) { let decoded; try { decoded = jwt.verify(token, secretKey); } catch(err) { if(err.message === 'jwt expired') console.log('expired token'); else if(err.message === 'invalid token') console.log('invalid token'); } if(!decoded) { return -1; } else { return decoded; } } };
JWT ์ธ์ฆ ๊ณผ์
- ํด๋ผ์ด์ธํธ ๋ก๊ทธ์ธ
- ๋ก๊ทธ์ธ ์ ๋ณด ๋ฐํ์ผ๋ก secret key ์ด์ฉํด ํ ํฐ ์์ฑ
- ๋ก๊ทธ์ธ ์ฑ๊ณต ์, ํ ํฐ ํด๋ผ์ด์ธํธ์๊ฒ ์ค
- ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ํ์ํ api ์์ฒญํ ๋, token ๊ฐ์ด ๋ณด๋ธ๋ค.
- token ์ ๋ณด ํ์ธํ์ฌ ์ ํจํ์ง ํ์
- ๋ค์ด์จ ์ ๋ณด๋ก ์ป์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ response ๋ณด๋ด์ค๋ค.
'it's me > ๐ฉโ๐ป ํ๋ก์ ํธ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Quadcore Team/Trend] ์ธ๊ธฐ ํธ์ ๋ญํน (0) 2020.03.02 [Quadcore Team/Trend]ํด์ํ๊ทธ ๋ถ์ (0) 2020.02.26 [4์ฃผ์ฐจ] - word count with Spark (0) 2020.02.01 QuadCore Team Project (0) 2020.02.01