2022.07.14(Thurs)
[TIL] Day57
[SEB FE] Day56
Hyper Text Transfer Protocol Secure Socket layer
(HTTP
+Secure
)
:HTTP
์์ฒญ์SSL
์ด๋TLS
์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด, HTTP ํต์ ์ ํ๋ ๊ณผ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ฌ ์ ์กํ๋ ๋ฐฉ๋ฒ
โฐย HTTPS ๋ชฉ์
๋์นญํค
๋ฐฉ์: ์์ชฝ์ด ๊ณตํต ๋น๋ฐํค๋ฅผ ๊ณต์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํธํ ๋ฐ ๋ณตํธํํ๋ ๊ฒ๋น๋์นญํค
๋ฐฉ์: ๊ณต๊ฐํค์ ๋น๋ฐํค๋ฅผ ๊ฐ์ง๊ณ ์๋๊ฐ ๋์ ๊ณต๊ฐํค๋ก ์ํธํํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ธ์ด ๊ฐ์ง ๋น๋ฐํค๋ก ๋ณตํธํํ๋ ๊ฒCA
(Certificate Authority
): ์๋ฒ ์ ์ ๋ณด์ฆํ ์ ์๋ ์ 3์๋ก์จ, ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํด์ฃผ๋ ์๊ฒฉํ๊ฒ ๊ณต์ธ๋ ๊ธฐ๊ดโ ย ์ธ์ฆ์๊ฐ CA ๋น๋ฐํค๋ก ์ํธํ๋์ด ์๊ธฐ ๋๋ฌธ์ CA ๊ฐ์ธํค๋ก ๋ณตํธํ ๊ฐ๋ฅ
๐ย ํด๋น CA์์ ๋ฐ๊ธํ ์ธ์ฆ์๋ผ๋ ๊ฒ์ ๋ณด์ฆ ๊ฐ๋ฅ!!
โฐ
SSL
โTLS
: ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ์ CA๋ฅผ ํตํด ์๋ฒ๋ฅผ ์ธ์ฆํ๋ ๊ณผ์ & ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋ ๊ณผ์ ์ ์์ฐ๋ฅธ ํ๋กํ ์ฝ
โฐย HTTPS ํต์ ๊ณผ์
โฐย HTTPS ์ฌ์ค ์ธ์ฆ์ ๋ฐ๊ธ / ์๋ฒ ๊ตฌํ
# mkcert install
$ brew install mkcert
# [์ธ์ฆ์ ์์ฑ]
# ์ธ์ฆ๋ ๋ฐ๊ธ๊ธฐ๊ด์ผ๋ก ๋ก์ปฌ ์ถ๊ฐ
$ mkcert -install
# ๋ก์ปฌ ํ๊ฒฝ์ ๋ํ ์ธ์ฆ์ ์์ฑ
$ kcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1
# => cert.pem, key.pem ํ์ผ ์์ฑ๋จ!
// Node.js https module๋ฅผ ์ด์ฉํ์ฌ HTTPS ์๋ฒ ๊ตฌํ
const https = require('https');
const fs = require('fs');
https
.createServer(
{
key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
},
function (req, res) {
res.write('Success:) https server!!');
res.end();
}
)
.listen(3001);
// Express.js ์ด์ฉํ์ฌ HTTPS ์๋ฒ ๊ตฌํ
const https = require('https');
const fs = require('fs');
const express = require('express');
const app = express();
https
.createServer(
{
key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
},
app.use('/', (req, res) => {
res.send('Success:) https server!!');
})
)
.listen(3001);
โ ngrok
(HTTP ์๋ฒ โ HTTPS ํ๋กํ ์ฝ๋ก ํฐ๋๋งํด์ฃผ๋ ํ๋ก๊ทธ๋จ) ์ด์ฉํ์ฌ HTTPS
๋ก ํฐ๋๋งํด๋ณด๊ธฐ~!
: ์ด๋ค ๋ฌธ์์ด์ ์์์ ์ฐ์ฐ์ ์ ์ฉํ์ฌ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ๋ณํํ๋ ๊ฒ
โฐย Hashing ์ฒ ์น
โฐย ์ํธํ(
Encryption
)
: ์์์ ๋ฐฉ์์ ์ฌ์ฉํด์ ์ ๋ณด๋ฅผ ๋ค๋ฅธ ํํ๋ก ๋ณํํ์ฌ ํด๋น ์ ๋ณด๋ฅผ ์์ ํ ์ฌ๋์ ์ ์ธํ๊ณ ์ดํดํ ์ ์๋๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ๊ณผ์
โฐย Salt
: ์ํธํํด์ผ ํ๋ ๊ฐ์ ๋ณ๋ ๊ฐ์ ์ถ๊ฐํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณํํ๋ ๊ฒ
โ ์ํธํ๋ง ํด๋์ผ๋ฉด ํด์๋ ๊ฒฐ๊ณผ ํญ์ ๋์ผ
๐ Salt ์ฌ์ฉ์, ๊ธฐ์กด ํด์๊ฐ๊ณผ ์ ํ ๋ค๋ฅธ ํด์๊ฐ์ด ๋ฐํ๋์ด ์๊ณ ๋ฆฌ์ฆ์ด ๋ ธ์ถ๋์ด๋ ์๋ณธ๊ฐ์ ๋ณดํธํ ์ ์์ โ ์์ ์ฅ์น ์ญํ !!
โ ย ์ํธํํ๋ ค๋ ๊ฐ + Salt ๊ฐ โ Hash ๊ฐ
โ Rainbow Table
: ํน์ ์
๋ ฅ๊ฐ ํด์ฑ ๊ฒฐ๊ณผ๋ฅผ ๋๋์ผ๋ก ๋ชจ์๋์ ํ
โฐย Salt ์ฌ์ฉ์ ์ฃผ์์
: ์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์์์ฑ์๋ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ๋ฒ
๐ย ์๋ฒ๋ ํด๋ผ์ด์ธํธ ์ฟ ํค๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์
โ ํด๋น ๋๋ฉ์ธ์ ์ฟ ํค ์กด์ฌ์, ์น ๋ธ๋ผ์ฐ์ ๋ ๋๋ฉ์ธ์๊ฒ http ์์ฒญ์ ์ฟ ํค ํจ๊ป ์ ๋ฌ
์ฟ ํค ์ต์
์ผ๋ก ํํ ๊ฐ๋ฅโ URL: `http://www.localhost:3000/users/login`
Domain
: ์๋ฒ์ ์ ์ํ ์ ์๋ ์ด๋ฆ
localhost
Path
: ์ธ๋ถ ๊ฒฝ๋ก๋ก์จ ์๋ฒ๊ฐ ๋ผ์ฐํ
ํ ๋ ์ฌ์ฉํ๋ ๊ฒฝ๋ก
/users/login
MaxAge
/ Expires
: ์ฟ ํค๊ฐ ์ ํจํ ๊ธฐ๊ฐ์ ์ ํ๋ ์ต์
MaxAge
: ์ฟ ํค๊ฐ ์ ํจํ ์๊ฐ์ ์ด ๋จ์๋ก ์ค์ ํ๋ ์ต์
Expires
: ์ธ์ ๊น์ง ์ฟ ํค๊ฐ ์ ํจํ์ง ๋ ์ง์ ๊ฐ๋ฅMaxAge
/ Expires
์ต์
์๋ ์ฟ ํค๋ก, ๋ธ๋ผ์ฐ์ ์คํ ์ค์ผ ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ ์ฟ ํคSecure
: ์ฌ์ฉํ๋ ํ๋กํ ์ฝ์ ๋ฐ๋ฅธ ์ฟ ํค ์ ์ก ์ฌ๋ถ ๊ฒฐ์ ์ต์
true
โ HTTPS
์ด์ฉ์์๋ง ์ฟ ํค ์ ์ก ๊ฐ๋ฅHTTP
, HTTPS
๋ฑ์ ํ๋กํ ์ฝ ์๊ด์์ด ๋ชจ๋ ์ฟ ํค ์ ์ก ๊ฐ๋ฅHttpOnly
: JS์์ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค์ ์ ๊ทผ ์ฌ๋ถ ๊ฒฐ์
true
โ JS๋ก ์ฟ ํค ์ ๊ทผ ๋ถ๊ฐ โfalse
โ document.cookie
๋ฅผ ์ด์ฉํด JS์์ ์ฟ ํค์ ๊ทผ ๊ฐ๋ฅ โญ๏ธ โ XSS ๊ณต๊ฒฉ ์ทจ์ฝSameSite
: ์์ฒญ์ ๋ณด๋ธ Origin & ์๋ฒ์ ๋๋ฉ์ธ, ํ๋กํ ์ฝ, ํฌํธ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ (์ด ์ค ํ๋๋ผ๋ ๋ค๋ฅด๋ฉด Cross-Origin
!)
Cross-Origin
์์ฒญ์ ๋ฐ์ ๊ฒฝ์ฐ, ์์ฒญ์์ ์ฌ์ฉํ ๋ฉ์๋ & ํด๋น ์ต์
(GET
, POST
โฆ) ์กฐํฉ ๊ธฐ์ค์ผ๋ก ์๋ฒ์ ์ฟ ํค ์ ์ก ์ฌ๋ถ ๊ฒฐ์
Lax
: Cross-Origin ์์ฒญ โ GET ๋ฉ์๋์ ๋ํด์๋ง ์ฟ ํค ์ ์ก ๊ฐ๋ฅ
Strict
: ๊ฐ์ฅ ์๊ฒฉํ ์ต์
์ผ๋ก, Cross-Origin์ด ์๋ same-site
์ธ ๊ฒฝ์ฐ์๋ง ์ฟ ํค ์ ์ก ๊ฐ๋ฅ
None
: ํญ์ ์ฟ ํค๋ฅผ ๋ณด๋ด์ค ์ ์์. But, Secure
์ต์
ํ์
๐ [server] โSet-Cookie
โ> [client] โCookie
โ> [server]
โย ์ฟ ํค๋ ์ค๋ ์๊ฐ๋์ ์ ์ง๋ ์ ์์ผ๋ฉฐ, HttpOnly ์ต์ ๋ฏธ์ฌ์ฉ์ JS๋ฅผ ์ด์ฉํ์ฌ ์ฟ ํค์ ์ ๊ทผ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ฟ ํค์ ๋ฏผ๊ฐ์ ๋ณด๋ฅผ ๋ด๋๊ฑด ์ํ ๐งจ
: ์ฌ์ฉ์๊ฐ ์ธ์ฆ์ ์ฑ๊ณตํ ์ํ
โ ์ธ์ฆ์ ๋ฐ๋ผ ๋ฆฌ์์ค ์ ๊ทผ ๊ถํ(Authorization)์ด ๋ฌ๋ผ์ง
๐ย Login
[ClientโServer] ์ฌ์ฉ์๊ฐ ์น์ฌ์ดํธ์์ ๋ก๊ทธ์ธ ์๋
[ServerโSession_Store] DB์ ์ ๋ณด ๋ฐ ์ธ์ ์ ์ฅ
[Session_StoreโServer] ์ธ์ ์์ฑ์, ๊ฐ ์ธ์ ๊ตฌ๋ถ ๊ฐ๋ฅํ ์ธ์ ID ๋ฐํ
[Server โ Client] ์ค์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ํธํ๋ ์ธ์ ID๋ก ์ ์ฅ
โย ํด๋ผ์ด์ธํธ์ ์ธ์ ์ฑ๊ณต์ ์ฆ๋ช ํ ์๋จ์ผ๋ก์จ ์ธ์ ID ์ ๋ฌ
โย ์น์ฌ์ดํธ์์ ๋ก๊ทธ์ธ ์ ์ง ์๋จ์ผ๋ก ์ฟ ํคย ์ฌ์ฉ (์ฟ ํค์ ์๋ฒ์์ ๋ฐ๊ธํ ์ธ์ ID ์ ์ฅ)
[ClientโServer] ์ ํจํ ์ธ์ ID๋ก ํ์ํ ์์ ์ํ
์ธ์ ์คํ ์ด์ ํด๋น ์ธ์ ์กด์ฌ์ ์๋ฒ๋ ํด๋น ์์ฒญ์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค๊ณ ํ๋จ
โย ์ฟ ํค์ ์ธ์ ID ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ, ์๋ฒ๋ ํด๋น ์์ฒญ์ด ์ธ์ฆ๋์ง ์์์์ ์๋ ค์ค
๐ย Logout
โ ์ธ์
ID๊ฐ ๋ด๊ธด ์ฟ ํค๋ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋จ
โ ์ธ์
์ ์๋ฒ์ ์ ์ฅ๋จ
โ ์๋ฒ๋ ์ธ์
ID๋ก๋ง ์ธ์ฆ ์ฌ๋ถ ํ๋จ!
โย ์ฟ ํค๋ ์ธ์ ID ์ฆ, ์ธ์ฆ ์ฑ๊ณต์ ๋ํ ์ฆ๋ช ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก, ํ์ทจ๋ ๊ฒฝ์ฐ ์๋ฒ๋ ํด๋น ์์ฒญ์ด ์ธ์ฆ๋ ์ฌ์ฉ์ ์์ฒญ์ด๋ผ๊ณ ํ๋จ ๐ฅฒย ๐ย ๊ณต๊ณต PC์์ ๋ก๊ทธ์์!!
โย ์๋ฒ๋ ํด๋ผ์ด์ธํธ ์ฟ ํค๋ฅผ ์์๋ก ์ญ์ ๋ถ๊ฐ โ
ย ย ย ย ย ๋์ , set-cookie
๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ฟ ํค ์ ์ก์ ์ธ์
ID ํค ๊ฐ์ ๋ฌดํจํ ๊ฐ์ผ๋ก ๊ฐฑ์ ๊ฐ๋ฅ
: ์ธ์ ์ ๋์ ๊ด๋ฆฌํด์ฃผ๋ ๋ชจ๋๋ก, express ์๋ฒ์์ ์ฝ๊ฒ ์ธ์ ์ ์ํ ๊ณต๊ฐ์ ๋ค๋ฃฐ ์ ์๋๋ก ๋ง๋ค์ด์ค (๋ฏธ๋ค์จ์ด)
const express = require('express');
const session = require('express-session');
const app = express();
app.use(
session({
secret: '@beanxx', // ๋น๋ฐํค -> ์ํธํํ์ฌ ์ธ์
ID ์์ฑ -> ํด๋ผ์ด์ธํธ์๊ฒ ์ฟ ํค๋ก ์ ์ก
resave: false,
saveUninitialized: true,
cookie: {
domain: 'localhost',
path: '/',
maxAge: 24 * 6 * 60 * 10000,
sameSite: 'none',
httpOnly: false,
secure: true,
},
})
);
์ธ์
๊ฐ์ฒด
- ์ ์ ๋ณ๋ก ๋
๋ฆฝ์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด โ ์ ์ ๋ณ๋ก ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ ์ ์ฅ ๊ฐ๋ฅreq.session
์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅ โ ์ธ์
์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ๋ถ๋ฌ์ฌ ์ ์์โ
ย Cookie
& Session
Summary
์ค๋ช | ์ ์ ์ํ ์ ์ฅ ๊ฒฝ๋ก | ๐ | ๐ | |
---|---|---|---|---|
Cookie ๐ช | http์ statelessํ ๊ฒ์ ๋ณด์ํด์ฃผ๋ ๋๊ตฌ | Client | ์๋ฒ ๋ถ๋ด โฌ๏ธ | ์ฟ ํค ๊ทธ ์์ฒด๋ ์ธ์ฆ โ |
Session | - ์ ์ ์ํ๋ฅผ ์๋ฒ๊ฐ ๊ฐ์ง (stateful) - ์ ์ ์ํ์ ๊ถํ ๋ถ์ฌ๋ฅผ ์ํด ์ธ์ ID๋ฅผ ์ฟ ํค๋ก ์ ์ก | Server | ์ ๋ขฐํ ์ ์๋ ์ ์ ์ธ์ง ์๋ฒ์์ ์ถ๊ฐ ํ์ธ ๊ฐ๋ฅ | ํ๋์ ์๋ฒ์์๋ง ์ ์ ์ํ๋ฅผ ๊ฐ์ง๋ฏ๋ก ๋ถ์ฐ์ ๋ถ๋ฆฌ |
: ๋ก๊ทธ์ธ ์ํ ์ ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฐ๋จ ์น ์ฑ ๊ตฌํํด๋ณด๊ธฐ ๐
๐พย ํ๋ฒ ๋ค์ ๊ณต๋ถํ๊ณ ๋ค์ ์
๋ก๋ํ๊ธฐ!~!