λ…μ„œ

[ 독후감 ] ν•œ ꢌ으둜 λλ‚΄λŠ” Node & Express 2νŒμ„ 읽고...

YWTechIT 2022. 2. 28. 07:37
728x90

πŸ“ [ 독후감 ] Web Development with Node & Express 2νŒμ„ 읽고...


✏️ μ„œλ‘ 

이 책을 보게 된 κ³„κΈ°λŠ” μ—˜λ¦¬μŠ€ νŒ€ ν”„λ‘œμ νŠΈμ—μ„œ ν”„λ‘ νŠΈμ—”λ“œλ₯Ό μ€€λΉ„ν•˜κ³  있던 λ‚˜μ—κ²Œ λ¬΄μ§€ν–ˆλ˜ λ°±μ—”λ“œ 파트λ₯Ό λ‹΄λ‹Ήν•˜κ²Œ λ˜μ—ˆκ³ , 맨땅에 ν—€λ”©ν•˜λŠ” 격으둜 λ°±μ—”λ“œμ— κ΄€ν•œ 정보λ₯Ό 이리저리 μ°Ύμ•„λ³΄λ˜ 쀑 비ꡐ적 졜근(2021.5.21.)에 μΆœνŒν–ˆκ³  Spring을 λ‹€λ£¨λŠ” 책이 μ•„λ‹ˆλΌ Express.jsλ₯Ό λ‹€λ£¨λŠ” μ„œμ μ΄μ–΄μ„œ κ΅¬λ§€ν–ˆλ‹€. 책은 μ•ŒλΌλ”˜μ—μ„œ μ£Όλ¬Έν–ˆκ³ , 책은 μ•½ 450νŽ˜μ΄μ§€λ‘œ κ΅¬μ„±λ˜μ–΄μžˆμœΌλ©° λ…μ„œκΈ°κ°„μ€ 2022.01.25 ~ 2022.02.19이닀.


728x90

✏️ 본둠

ν‹ˆν‹ˆμ΄ 책을 읽으며 λ‹Ήμž₯에 λ°±μ—”λ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Όν•˜λŠ”ν„°λΌ λ‚΄κ°€ ν•„μš”ν•œ 주제만 λ¨Όμ € μ‚΄νŽ΄λ΄€λ‹€. μ΅μŠ€ν”„λ ˆμŠ€ μ†Œκ°œ, ν’ˆμ§ˆλ³΄μ¦, 쿠킀와 μ„Έμ…˜, 미듀웨어, 지속성, λΌμš°νŒ…, REST API와 JSON, SPA, λ³΄μ•ˆ νŒŒνŠΈμ˜€λ‹€. 이 μ€‘μ—μ„œ κ°€μž₯ 기얡에 λ‚¨λŠ” 뢀뢄은 λ°”λ‘œ 미듀웨어, 쿠킀와 μ„Έμ…˜μΈλ°, λ‚˜λŠ” JWTλ₯Ό μ΄μš©ν•˜μ—¬ 인증을 κ΅¬ν˜„ν–ˆμ§€λ§Œ μ„œλ²„μ—μ„œ μΏ ν‚€λ₯Ό μ „ν˜€ μΈμ‹ν•˜μ§€ λͺ»ν•˜λŠ” λ¬Έμ œκ°€ μžˆμ—ˆλŠ”λ° κ²°κ΅­ cookie-parser 미듀웨어λ₯Ό μž‘μ„±ν•˜μ§€ μ•Šμ•„μ„œ μƒκΈ°λŠ” λ¬Έμ œμ˜€λ‹€.. (이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ•½ 3μ‹œκ°„μ„ μ‚½μ§ˆν–ˆλ‹€.) 덕뢄에 λ―Έλ“€μ›¨μ–΄μ˜ μ€‘μš”μ„±μ„ κΉ¨λ‹¬μ•˜λ‹€. 그리고 쿠킀에 λŒ€ν•΄ 기쑴에 μ•Œκ³  있던 지식과 λ”λΆˆμ–΄ λͺ‡ 가지 μƒˆλ‘œμš΄ 사싀을 μ•Œκ²Œ λ˜μ—ˆλŠ”λ°, μΏ ν‚€μ˜ κ΄€ν•΄ μ•Œμ•„λ‘¬μ•Ό ν•  μ€‘μš”ν•œ λ‚΄μš©μ€ λ‹€μŒκ³Ό κ°™λ‹€.

1. μ‚¬μš©μžκ°€ μΏ ν‚€ λ‚΄μš©μ„ λ³Ό 수 μžˆλ‹€.
  - μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ— λ³΄λ‚΄λŠ” μΏ ν‚€λŠ” λͺ¨λ‘ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ³Ό 수 μžˆλ‹€. μΏ ν‚€λ₯Ό μ•”ν˜Έν™”ν•΄μ„œ μ½˜ν…μΈ λ₯Ό λ³΄ν˜Έν•  수 있긴 ν•˜μ§€λ§Œ, λ–³λ–³ν•œ λͺ©μ μœΌλ‘œλ§Œ μ‚¬μš©ν•œλ‹€λ©΄ ꡳ이 μ•”ν˜Έν™”ν•  μ΄μœ κ°€ μ—†λ‹€. μ„œλͺ…λœ (Signed)μΏ ν‚€λŠ” μ½˜ν…μΈ λ₯Ό 읽기 μ–΄λ ΅κ²Œ λ§Œλ“€κΈ΄ ν•˜κ² μ§€λ§Œ, μ•”ν˜Έν™”λΌκ³  ν•  수 μžˆλŠ” μˆ˜μ€€μ΄ μ•„λ‹ˆλ‹€.

2. μ‚¬μš©μžκ°€ μΏ ν‚€λ₯Ό μ‚­μ œν•˜κ±°λ‚˜ κΈˆμ§€ν•  수 μžˆλ‹€.
  - μ‚¬μš©μžλŠ” μΏ ν‚€ 전체에 λŒ€ν•œ κΆŒν•œμ΄ 있고, λΈŒλΌμš°μ €μ—λŠ” μΏ ν‚€λ₯Ό κ°œλ³„μ μœΌλ‘œ, λ˜λŠ” ν•œκΊΌλ²ˆμ— μ‚­μ œν•˜λŠ” κΈ°λŠ₯이 μžˆλ‹€. λ˜ν•œ, μ‚¬μš©μžκ°€ μΏ ν‚€λ₯Ό κΈˆμ§€ν•  μˆ˜λ„ μžˆλŠ”λ° 이럴 땐 μΏ ν‚€ 없이도 μ œλŒ€λ‘œ λ™μž‘ν•  수 μžˆλŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 정말 λ‹¨μˆœν•œ κΈ°λŠ₯ λ§κ³ λŠ” μˆ˜ν–‰ν•˜κΈ° μ–΄λ ΅λ‹€.

3. μΏ ν‚€λŠ” 곡격에 μ‚¬μš©λ  수 μžˆλ‹€.
  - XSS(cross-site-scripting attack) 곡격 쀑 μ•…μ˜μ μΈ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ μΏ ν‚€ μ½˜ν…μΈ λ₯Ό λ°”κΎΈλŠ” 방법도 μžˆλ‹€. μ„œλ²„μ— μ „μ†λ˜λŠ” μΏ ν‚€λ₯Ό λ§Ήμ‹ ν•΄μ„œλŠ” μ•ˆ λ˜λŠ” 이유 쀑 ν•˜λ‚˜λ‹€. `μ„œλͺ…λœ μΏ ν‚€(Signed cookie)`λ₯Ό μ‚¬μš©ν•˜λ©΄ μ‚¬μš©μžλ‚˜ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ μΏ ν‚€λ₯Ό λ³€μ‘°ν–ˆμ„ 경우 κ·Έ 흔적이 λͺ…λ°±νžˆ λ“œλŸ¬λ‚˜λ―€λ‘œ 곡격을 λ§‰λŠ”λ° 도움이 λœλ‹€. (μ„œλͺ…λœ μΏ ν‚€λŠ” 일반적인 쿠킀보닀 μš°μ„ μˆœμœ„κ°€ λ†’λ‹€. μ„œλͺ…λœ μΏ ν‚€μ—μ„œ μ‚¬μš©λœ 이름을 일반 μΏ ν‚€μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†λ‹€.) λ˜λŠ” `httpOnly` μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μΏ ν‚€λ₯Ό μˆ˜μ •ν•˜μ§€ λͺ»ν•˜κ³  μ„œλ²„μ—μ„œλ§Œ κ°€λŠ₯ν•˜κ²Œλ” μ„€μ •ν•  μˆ˜λ„ μžˆλ‹€. 이런 경우 ν™œμš©λ„κ°€ 쑰금 λ–¨μ–΄μ§€μ§€λ§Œ 훨씬 μ•ˆμ „ν•˜λ‹€.

4. μΏ ν‚€λ₯Ό λ‚¨μš©ν•˜λ©΄ μ‚¬μš©μžκ°€ λˆˆμΉ˜μ±ˆλ‹€.
  - μ‚¬μš©μžμ˜ 컴퓨터에 μΏ ν‚€λ‚˜ 데이터λ₯Ό λ„ˆλ¬΄ 많이 μ €μž₯ν•˜λ©΄ μ‚¬μš©μžλ₯Ό μ§œμ¦λ‚˜κ²Œ ν•  수 μžˆμœΌλ―€λ‘œ ν”Όν•΄μ•Ό ν•œλ‹€. μΏ ν‚€λŠ” μ΅œμ†Œν•œμœΌλ‘œ μœ μ§€ν•΄λΌ.

5. μΏ ν‚€μ—μ„œ μ‚¬μš© ν•  수 μžˆλŠ” option
  - domain: 쿠킀에 도메인을 μ—°κ²°ν•œλ‹€. ν•˜μ§€λ§Œ ν˜„μž¬ μ„œλ²„κ°€ μ‹€ν–‰ 쀑인 도메인이 μ•„λ‹Œ λ‹€λ₯Έ 도메인과 μ—°κ²°ν•  μˆ˜λŠ” μ—†λ‹€.
  - path: μΏ ν‚€κ°€ 적용될 경둜λ₯Ό μ§€μ •ν•œλ‹€. 기본값인 `/`λ₯Ό μ‚¬μš©ν•˜λ©΄ μ‚¬μ΄νŠΈμ˜ λͺ¨λ“  νŽ˜μ΄μ§€μ— μΏ ν‚€κ°€ μ μš©λœλ‹€. 경둜λ₯Ό `/foo`둜 μ„€μ •ν•˜λ©΄ `/foo`, `/foo/bar` 등에 μ μš©λœλ‹€.
  - maxAge: ν΄λΌμ΄μ–ΈνŠΈκ°€ μΏ ν‚€λ₯Ό μ–Όλ§ˆλ‚˜ 였래 λ³΄κ΄€ν•˜κ³  μžˆμ–΄μ•Ό ν•˜λŠ”μ§€ λ°€λ¦¬μ΄ˆ λ‹¨μœ„λ‘œ μ§€μ •ν•œλ‹€. 이 μ˜΅μ…˜μ„ μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ μΏ ν‚€λŠ” λΈŒλΌμš°μ €λ₯Ό 닫을 λ•Œ μ‚­μ œλœλ‹€. `expired` μ˜΅μ…˜μ—μ„œ 만료 λ‚ μ§œλ₯Ό μ„€μ •ν•  μˆ˜λ„ μžˆμ§€λ§Œ 문법이 λ³΅μž‘ν•˜κΈ° λ•Œλ¬Έμ— `maxAge`λ₯Ό κΆŒν•œλ‹€.
  - secure: `HTTPS` 연결을 ν†΅ν•΄μ„œλ§Œ μΏ ν‚€λ₯Ό μ „μ†‘ν•œλ‹€.
  - httpOnly: μ„œλ²„μ—μ„œλ§Œ μΏ ν‚€λ₯Ό μˆ˜μ •ν•œλ‹€. 즉, clientμ—μ„œλŠ” 쿠리λ₯Ό μˆ˜μ •ν•  수 μ—†λ‹€. XSS곡격을 λ§‰λŠ”λ° 도움이 λœλ‹€.
  - signed: 쿠킀에 μ„œλͺ…을 ν•΄μ„œ `res.cookie`κ°€ μ•„λ‹ˆλΌ `res.signedCookies`μ—μ„œ μ ‘κ·Όν•  수 있게 ν•œλ‹€. μ„œλͺ…λœ μΏ ν‚€κ°€ λ³€μ‘°λ˜λ©΄ μ„œλ²„λŠ” κ·Έ μΏ ν‚€λ₯Ό κ±°λΆ€ν•˜κ³  μ›λž˜ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™” ν•œλ‹€.

λ˜ν•œ, passportλ₯Ό μ΄μš©ν•΄ 인증파트λ₯Ό κ΅¬ν˜„ν–ˆλŠ”λ°, GitHub Strategyλ₯Ό μ‚¬μš©ν•΄μ„œ λ‹€μŒκ³Ό 같이 인증을 κ΅¬ν˜„ν–ˆλ‹€. μ²˜μŒμ—λŠ” passport ν™ˆνŽ˜μ΄μ§€μ˜ docs와 λΉ„μŠ·ν•˜κ²Œ μž‘μ„±ν–ˆμ§€λ§Œ, λ‹€μŒ μ½”λ“œλŠ” λ‚΄κ°€ GitFarm ν”„λ‘œμ νŠΈμ—μ„œ μž‘μ„±ν•œ λ°±μ—”λ“œ μ½”λ“œμ΄λ‹€. μ½”λ“œλŠ” 짧아 λ³΄μ΄μ§€λ§Œ λ‚˜μ˜ μ„œλΉ„μŠ€μ— ν•„μš”ν•œ 정보에 맞게 μˆ˜μ •ν•˜λŠ”λ° κ·Έ μž‘μ—…μ΄ 생각보닀 였래 κ±Έλ Έλ‹€.

// passport/strategy/GitHub.js
import GitHub from "passport-github2";
import keys from "../../config/keys.js";
import { User } from "../../model/index.js";

const GitHubStrategy = GitHub.Strategy;
const { clientID, clientSecret, callbackURL } = keys.GitHub;

const config = {
  clientID,
  clientSecret,
  callbackURL,
};

export default new GitHubStrategy(
  config,
  async (accessToken, refreshToken, profile, done) => {
    const { username } = profile;
    const { id, avatar_url: avatarUrl } = profile._json;

    const findUser = await User.findOne({ id });
    if (!findUser) {
      const newUser = new User({
        id,
        username,
        avatarUrl,
        accessToken,
      });

      newUser.save();
      return done(null, newUser);
    }
    return done(null, findUser);
  },
);

// routes/api/auth.js
router.get(
  "/github",
  passport.authenticate("github", {
    scope: ["repo", "profile", "user"],
    session: false,
  }),
);

router.get(
  "/github/callback",
  passport.authenticate("github", {
     session: false,
    failureRedirect: "/api/auth/login/failed",
  }),
  async (req, res) => {
    const { id, username } = req.user;
    const payload = { id, username };
    const token = await createToken(payload);
    res.cookie("token", token, cookieConfig);
    res.redirect("/loading");
  },
);

 


✏️ 결둠

이 책을 읽으며 μ΅œμ†Œν•œμ˜ λ°±μ—”λ“œμ—μ„œ ν•„μš”ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ”λ° 도움을 많이 λ°›μ•˜λ‹€. μ•„μ§κΉŒμ§€ μš°λ¦¬λ‚˜λΌμ—μ„œλŠ” Express.js보닀 Spring을 더 많이 μ‚¬μš©ν•˜μ§€λ§Œ, λ°±μ—”λ“œμ˜ 큰 틀은 λ²—μ–΄λ‚˜μ§€ μ•Šμ„ 것이닀. JAVA보닀 JSλ₯Ό 더 잘 μ•Œλ©΄μ„œ λ°±μ—”λ“œλ₯Ό 맛보고 싢은 λΆ„λ“€μ—κ²Œ μΆ”μ²œν•΄μ£Όκ³  싢은 책이닀.

 

reference

  1. ν•œ ꢌ으둜 λλ‚΄λŠ” Node & Express : λͺ¨λ˜ 웹을 μœ„ν•œ μ„œλ²„ μ‚¬μ΄λ“œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  것
  2. Passport-GitHub2
λ°˜μ‘ν˜•