[TIL] Day57 #HTTPS #Cookie #Session

Beanxxยท2022๋…„ 7์›” 18์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
57/120
post-thumbnail

2022.07.14(Thurs)

[TIL] Day57
[SEB FE] Day56

โ˜‘๏ธย ์›น ์ธ์ฆ/๋ณด์•ˆ

๐Ÿ“Žย HTTPS

Hyper Text Transfer Protocol Secure Socket layer (HTTP + Secure)
: HTTP ์š”์ฒญ์„ SSL์ด๋‚˜ TLS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด, HTTP ํ†ต์‹ ์„ ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ•

โžฐย HTTPS ๋ชฉ์ 

  1. ์•”ํ˜ธํ™”: ์ œ3์ž๊ฐ€ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ๊ณ ๋ฐ›๋Š” ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๊ฒƒ
    • ๋Œ€์นญํ‚ค ๋ฐฉ์‹: ์–‘์ชฝ์ด ๊ณตํ†ต ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ณต์œ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™”ํ•˜๋Š” ๊ฒƒ
      • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ
    • ๋น„๋Œ€์นญํ‚ค ๋ฐฉ์‹: ๊ณต๊ฐœํ‚ค์™€ ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒ๋Œ€๊ฐ€ ๋‚˜์˜ ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐœ์ธ์ด ๊ฐ€์ง„ ๋น„๋ฐ€ํ‚ค๋กœ ๋ณตํ˜ธํ™”ํ•˜๋Š” ๊ฒƒ
      • ๋Œ€์นญํ‚ค๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ
      • A_key๋กœ ์•”ํ˜ธํ™” โ†’ B_key๋กœ๋งŒ ๋ณตํ˜ธํ™” ๊ฐ€๋Šฅ!!
  2. ์ธ์ฆ์„œ(Certificate): ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์˜ ์‘๋‹ต๊ณผ ํ•จ๊ป˜ ์ „๋‹ฌ๋œ ์ธ์ฆ์„œ ํ™•์ธ ๊ฐ€๋Šฅ
    • ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž ์‹ ์› ๋ณด์žฅ
    • ๋„๋ฉ”์ธ ์ข…์†
    • CA(Certificate Authority): ์„œ๋ฒ„ ์‹ ์› ๋ณด์ฆํ•  ์ˆ˜ ์žˆ๋Š” ์ œ3์ž๋กœ์จ, ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š” ์—„๊ฒฉํ•˜๊ฒŒ ๊ณต์ธ๋œ ๊ธฐ๊ด€
      ๐Ÿ‘‰ย ์„œ๋ฒ„ ๊ณต๊ฐœํ‚ค์™€ ์ •๋ณด๋ฅผ CA ๋น„๋ฐ€ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰

โœ…ย ์ธ์ฆ์„œ๊ฐ€ CA ๋น„๋ฐ€ํ‚ค๋กœ ์•”ํ˜ธํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— CA ๊ฐœ์ธํ‚ค๋กœ ๋ณตํ˜ธํ™” ๊ฐ€๋Šฅ
๐Ÿ‘‰ย ํ•ด๋‹น CA์—์„œ ๋ฐœ๊ธ‰ํ•œ ์ธ์ฆ์„œ๋ผ๋Š” ๊ฒƒ์„ ๋ณด์ฆ ๊ฐ€๋Šฅ!!

โžฐ SSL โ†’ TLS
: ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ„์˜ CA๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋ฅผ ์ธ์ฆํ•˜๋Š” ๊ณผ์ • & ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๊ณผ์ •์„ ์•„์šฐ๋ฅธ ํ”„๋กœํ† ์ฝœ

โžฐย HTTPS ํ†ต์‹  ๊ณผ์ •

  1. Hand Shake
  2. ๋น„๋ฐ€ ํ‚ค ์ƒ์„ฑ: ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ๊ฐ ์„ธ์…˜ ํ‚ค ์ƒ์„ฑ
  3. ์ƒํ˜ธ ํ‚ค ๊ฒ€์ฆ: 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

: ์–ด๋–ค ๋ฌธ์ž์—ด์— ์ž„์˜์˜ ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ

โžฐย Hashing ์ฒ ์น™

  1. ๋ชจ๋“  ๊ฐ’์— ๋Œ€ํ•œ ํ•ด์‹œ๊ฐ’ ๊ณ„์‚ฐ์€ ์˜ค๋ž˜๊ฑธ๋ฆฌ์ง€ ์•Š์•„์•ผ ํ•จ
  2. ์ตœ๋Œ€ํ•œ ํ•ด์‹œ๊ฐ’์„ ํ”ผํ•ด์•ผ ํ•˜๋ฉฐ, ๋ชจ๋“  ๊ฐ’์€ ๊ณ ์œ ํ•œ ํ•ด์‹œ๊ฐ’์„ ๊ฐ€์ง
  3. ์ž‘์€ ๋‹จ์œ„ ๋ณ€๊ฒฝ์ด๋ผ๋„ ์™„์ „ํžˆ ๋‹ค๋ฅธ ํ•ด์‹œ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•จ

โžฐย ์•”ํ˜ธํ™”(Encryption)
: ์ž„์˜์˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์„œ ์ •๋ณด๋ฅผ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์†Œ์œ ํ•œ ์‚ฌ๋žŒ์„ ์ œ์™ธํ•˜๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์—†๋„๋ก ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ณผ์ •

โžฐย Salt
: ์•”ํ˜ธํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฐ’์— ๋ณ„๋„ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€ํ˜•ํ•˜๋Š” ๊ฒƒ

โœŽ ์•”ํ˜ธํ™”๋งŒ ํ•ด๋†“์œผ๋ฉด ํ•ด์‹œ๋œ ๊ฒฐ๊ณผ ํ•ญ์ƒ ๋™์ผ
๐Ÿ‘‰ Salt ์‚ฌ์šฉ์‹œ, ๊ธฐ์กด ํ•ด์‹œ๊ฐ’๊ณผ ์ „ํ˜€ ๋‹ค๋ฅธ ํ•ด์‹œ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋…ธ์ถœ๋˜์–ด๋„ ์›๋ณธ๊ฐ’์„ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Œ โ†’ ์•ˆ์ „ ์žฅ์น˜ ์—ญํ• !!

โœ…ย ์•”ํ˜ธํ™”ํ•˜๋ ค๋Š” ๊ฐ’ + Salt ๊ฐ’ โ‡’ Hash ๊ฐ’

โœš Rainbow Table: ํŠน์ • ์ž…๋ ฅ๊ฐ’ ํ•ด์‹ฑ ๊ฒฐ๊ณผ๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ๋ชจ์•„๋†“์€ ํ‘œ

โžฐย Salt ์‚ฌ์šฉ์‹œ ์ฃผ์˜์ 

  1. User & Password ๋ณ„๋กœ ์œ ์ผํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•จ
  2. ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์ƒ์„ฑํ•  ๋•Œ & ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝํ•  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ž„์˜์˜ Salt๋ฅผ ์‚ฌ์šฉํ•ด์„œ Hashing
  3. ์ ˆ๋Œ€ ์žฌ์‚ฌ์šฉ ๊ธˆ์ง€ โŒ
  4. DB์˜ User Table์— ๊ฐ™์ด ์ €์žฅ๋˜์–ด์•ผ ํ•จ

: ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์— ์˜์†์„ฑ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ๋ฒ•
๐Ÿ‘‰ย ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ

โœŽ ํ•ด๋‹น ๋„๋ฉ”์ธ์— ์ฟ ํ‚ค ์กด์žฌ์‹œ, ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ๋„๋ฉ”์ธ์—๊ฒŒ http ์š”์ฒญ์‹œ ์ฟ ํ‚ค ํ•จ๊ป˜ ์ „๋‹ฌ

  • ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ์— ํŠน์ • ํ…Œ์ดํ„ฐ ์ €์žฅ โ†’ ๋‹ค์‹œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    But, ๋ฐ์ดํ„ฐ ์ €์žฅ ์ดํ›„ ํŠน์ • ์กฐ๊ฑด๋“ค์ด ๋งŒ์กฑ๋˜์–ด์•ผ ์ฟ ํ‚ค๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ ๐Ÿ‘‰ย ์ด๋Ÿฌํ•œ ์กฐ๊ฑด๋“ค์„ ์ฟ ํ‚ค ์˜ต์…˜์œผ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅ

โŒ˜ URL: `http://www.localhost:3000/users/login`

  1. Domain: ์„œ๋ฒ„์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„

    • ํฌํŠธ, ์„œ๋ธŒ ๋„๋ฉ”์ธ ์ •๋ณด(ex - www), ์„ธ๋ถ€ ๊ฒฝ๋กœ ํฌํ•จ โŒ
    • [Client] ์ฟ ํ‚ค ๋„๋ฉ”์ธ ์˜ต์…˜ & ์„œ๋ฒ„ ๋„๋ฉ”์ธ์ด ์ผ์น˜ํ•ด์•ผ๋งŒ ์ฟ ํ‚ค ์ „์†ก ๊ฐ€๋Šฅ
    • localhost
  2. Path: ์„ธ๋ถ€ ๊ฒฝ๋กœ๋กœ์จ ์„œ๋ฒ„๊ฐ€ ๋ผ์šฐํŒ…ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ๋กœ

    • ์„ค์ •๋œ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•˜๋Š” ํ•˜์œ„ ๊ฒฝ๋กœ๋กœ ์š”์ฒญํ•ด๋„ ์ฟ ํ‚ค๋ฅผ ์„œ๋ฒ„์— ์ „์†ก ๊ฐ€๋Šฅ
    • /users/login
  3. MaxAge / Expires : ์ฟ ํ‚ค๊ฐ€ ์œ ํšจํ•œ ๊ธฐ๊ฐ„์„ ์ •ํ•˜๋Š” ์˜ต์…˜

    • MaxAge: ์ฟ ํ‚ค๊ฐ€ ์œ ํšจํ•œ ์‹œ๊ฐ„์„ ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜
    • Expires: ์–ธ์ œ๊นŒ์ง€ ์ฟ ํ‚ค๊ฐ€ ์œ ํšจํ•œ์ง€ ๋‚  ์ง€์ • ๊ฐ€๋Šฅ
      • ์˜ต์…˜ ๊ฐ’์€ ํด๋ผ์ด์–ธํŠธ ์‹œ๊ฐ„ ๊ธฐ์ค€ โ†’ ์ง€์ • ์‹œ๊ฐ„, ๋‚ ์งœ ์ดˆ๊ณผ์‹œ ์ฟ ํ‚ค ์ž๋™ ํŒŒ๊ดด
    • ๐Ÿชย ์„ธ์…˜ ์ฟ ํ‚ค: MaxAge / Expires ์˜ต์…˜ ์—†๋Š” ์ฟ ํ‚ค๋กœ, ๋ธŒ๋ผ์šฐ์ € ์‹คํ–‰ ์ค‘์ผ ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ž„์‹œ ์ฟ ํ‚ค
      • ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ์‹œ ํ•ด๋‹น ์ฟ ํ‚ค ์‚ญ์ œ
    • ๐Ÿชย ์˜์†์„ฑ ์ฟ ํ‚ค: ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์ง€์ •๋œ ์œ ํšจ์‹œ๊ฐ„๋งŒํผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฟ ํ‚ค
  4. Secure: ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ฅธ ์ฟ ํ‚ค ์ „์†ก ์—ฌ๋ถ€ ๊ฒฐ์ • ์˜ต์…˜

    • true โ†’ HTTPS ์ด์šฉ์‹œ์—๋งŒ ์ฟ ํ‚ค ์ „์†ก ๊ฐ€๋Šฅ
    • ์ด ์˜ต์…˜์ด ์—†์œผ๋ฉด HTTP, HTTPS ๋“ฑ์˜ ํ”„๋กœํ† ์ฝœ ์ƒ๊ด€์—†์ด ๋ชจ๋‘ ์ฟ ํ‚ค ์ „์†ก ๊ฐ€๋Šฅ
  5. HttpOnly: JS์—์„œ ๋ธŒ๋ผ์šฐ์ €์˜ ์ฟ ํ‚ค์— ์ ‘๊ทผ ์—ฌ๋ถ€ ๊ฒฐ์ •

    • true โ†’ JS๋กœ ์ฟ ํ‚ค ์ ‘๊ทผ ๋ถˆ๊ฐ€ โŒ
    • false โ†’ document.cookie๋ฅผ ์ด์šฉํ•ด JS์—์„œ ์ฟ ํ‚ค์ ‘๊ทผ ๊ฐ€๋Šฅ โญ•๏ธ โ†’ XSS ๊ณต๊ฒฉ ์ทจ์•ฝ
  6. 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๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฟ ํ‚ค์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฟ ํ‚ค์— ๋ฏผ๊ฐ์ •๋ณด๋ฅผ ๋‹ด๋Š”๊ฑด ์œ„ํ—˜ ๐Ÿงจ



โ˜‘๏ธย Session

: ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์— ์„ฑ๊ณตํ•œ ์ƒํƒœ

  • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์œ ์ผํ•˜๊ณ  ์•”ํ˜ธํ™”๋œ ID ๋ถ€์—ฌ
  • ์ค‘์š” ๋ฐ์ดํ„ฐ๋Š” ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌ!

โœŽ ์ธ์ฆ์— ๋”ฐ๋ผ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ๊ถŒํ•œ(Authorization)์ด ๋‹ฌ๋ผ์ง

  • [Server] ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์— ์„ฑ๊ณตํ–ˆ์Œ์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•จ
  • [Client] ์ธ์ฆ ์„ฑ๊ณต์„ ์ฆ๋ช…ํ•  ์ˆ˜๋‹จ์„ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•จ

๐Ÿ“Žย ์„ธ์…˜๊ธฐ๋ฐ˜ ์ธ์ฆ(Session-based Authentication)

๐Ÿ“Œย Login

  1. [Clientโ†’Server] ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์—์„œ ๋กœ๊ทธ์ธ ์‹œ๋„

  2. [Serverโ†’Session_Store] DB์— ์ •๋ณด ๋ฐ ์„ธ์…˜ ์ €์žฅ

  3. [Session_Storeโ†’Server] ์„ธ์…˜ ์ƒ์„ฑ์‹œ, ๊ฐ ์„ธ์…˜ ๊ตฌ๋ถ„ ๊ฐ€๋Šฅํ•œ ์„ธ์…˜ID ๋ฐ˜ํ™˜

  4. [Server โ†’ Client] ์ค‘์š” ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”๋œ ์„ธ์…˜ID๋กœ ์ €์žฅ

    โœ‹ย ํด๋ผ์ด์–ธํŠธ์— ์„ธ์…˜ ์„ฑ๊ณต์„ ์ฆ๋ช…ํ•  ์ˆ˜๋‹จ์œผ๋กœ์จ ์„ธ์…˜ID ์ „๋‹ฌ

    โœ‹ย ์›น์‚ฌ์ดํŠธ์—์„œ ๋กœ๊ทธ์ธ ์œ ์ง€ ์ˆ˜๋‹จ์œผ๋กœ ์ฟ ํ‚คย ์‚ฌ์šฉ (์ฟ ํ‚ค์— ์„œ๋ฒ„์—์„œ ๋ฐœ๊ธ‰ํ•œ ์„ธ์…˜ID ์ €์žฅ)

  5. [Clientโ†’Server] ์œ ํšจํ•œ ์„ธ์…˜ID๋กœ ํ•„์š”ํ•œ ์ž‘์—… ์ˆ˜ํ–‰

  6. ์„ธ์…˜ ์Šคํ† ์–ด์— ํ•ด๋‹น ์„ธ์…˜ ์กด์žฌ์‹œ ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์š”์ฒญ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จ

    โœ‹ย ์ฟ ํ‚ค์— ์„ธ์…˜ID ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์š”์ฒญ์ด ์ธ์ฆ๋˜์ง€ ์•Š์•˜์Œ์„ ์•Œ๋ ค์คŒ

๐Ÿ“Œย Logout

โœŽ ์„ธ์…˜ID๊ฐ€ ๋‹ด๊ธด ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋จ
โœŽ ์„ธ์…˜์€ ์„œ๋ฒ„์— ์ €์žฅ๋จ
โœŽ ์„œ๋ฒ„๋Š” ์„ธ์…˜ID๋กœ๋งŒ ์ธ์ฆ ์—ฌ๋ถ€ ํŒ๋‹จ!

โœ‹ย ์ฟ ํ‚ค๋Š” ์„ธ์…˜ID ์ฆ‰, ์ธ์ฆ ์„ฑ๊ณต์— ๋Œ€ํ•œ ์ฆ๋ช…์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ํƒˆ์ทจ๋  ๊ฒฝ์šฐ ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์š”์ฒญ์ด ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ์ด๋ผ๊ณ  ํŒ๋‹จ ๐Ÿฅฒย ๐Ÿ‘‰ย ๊ณต๊ณต PC์—์„œ ๋กœ๊ทธ์•„์›ƒ!!

  • [Server] ์„ธ์…˜ ์ •๋ณด ์‚ญ์ œํ•ด์•ผ ํ•จ
  • [Client] ์ฟ ํ‚ค ๊ฐฑ์‹ ํ•ด์•ผ ํ•จ

โœ‹ย ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ ์ฟ ํ‚ค๋ฅผ ์ž„์˜๋กœ ์‚ญ์ œ ๋ถˆ๊ฐ€ โŒ
ย ย ย ย ย ๋Œ€์‹ , set-cookie๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ฟ ํ‚ค ์ „์†ก์‹œ ์„ธ์…˜ID ํ‚ค ๊ฐ’์„ ๋ฌดํšจํ•œ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹  ๊ฐ€๋Šฅ

๐Ÿ“Žย express-session

: ์„ธ์…˜์„ ๋Œ€์‹  ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ๋กœ, 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,
    },
  })
);
  • ์ฟ ํ‚ค๋กœ ์ „์†ก๋œ ์„ธ์…˜ID๋Š” ๊ณ ์œ ํ•œ ์„ธ์…˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๋ฉฐ ์„œ๋ฒ„์— ์ €์žฅ
    • ์„ธ์…˜ ๊ฐ์ฒด - ์œ ์ €๋ณ„๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด โ†’ ์œ ์ €๋ณ„๋กœ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฐ€๋Šฅ
      • req.session์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ โ†’ ์„ธ์…˜์— ์ž„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Œ
  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์„ธ์…˜ID๋ฅผ ์ด์šฉํ•ด ์œ ์ € ์ธ์ฆ์—ฌ๋ถ€ ํŒ๋‹จ ๊ฐ€๋Šฅ

โœ…ย Cookie & Session Summary

์„ค๋ช…์ ‘์† ์ƒํƒœ ์ €์žฅ ๊ฒฝ๋กœ๐Ÿ‘๐Ÿ‘Ž
Cookie ๐Ÿชhttp์˜ statelessํ•œ ๊ฒƒ์„ ๋ณด์™„ํ•ด์ฃผ๋Š” ๋„๊ตฌClient์„œ๋ฒ„ ๋ถ€๋‹ด โฌ‡๏ธ์ฟ ํ‚ค ๊ทธ ์ž์ฒด๋Š” ์ธ์ฆ โŒ
Session- ์ ‘์† ์ƒํƒœ๋ฅผ ์„œ๋ฒ„๊ฐ€ ๊ฐ€์ง (stateful)
- ์ ‘์† ์ƒํƒœ์™€ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•ด ์„ธ์…˜ID๋ฅผ ์ฟ ํ‚ค๋กœ ์ „์†ก
Server์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ €์ธ์ง€ ์„œ๋ฒ„์—์„œ ์ถ”๊ฐ€ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ๋งŒ ์ ‘์† ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ๋ถ„์‚ฐ์— ๋ถˆ๋ฆฌ

โ˜‘๏ธย [Pair] Auth Basic

: ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ„๋‹จ ์›น ์•ฑ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ ๐Ÿ™Œ

๐Ÿ‘พย ํ•œ๋ฒˆ ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜๊ณ  ๋‹ค์‹œ ์—…๋กœ๋“œํ•˜๊ธฐ!~!

profile
FE developer

0๊ฐœ์˜ ๋Œ“๊ธ€