** ๐Ÿ“Œ์›น ๋ณด์•ˆ ๊ธฐ์ดˆ**

์‹ค๋ฌด ์›น ์„œ๋น„์Šค์—์„œ ๋ฐ˜๋“œ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•  2๊ฐ€์ง€ ํ•ต์‹ฌ ๋ณด์•ˆ

๐Ÿ›ก๏ธ ์„ธ์…˜ ๊ณ ์ •(Session Fixation) ๊ณต๊ฒฉ ๋ฐฉ์ง€

๐Ÿ” ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”(SHA256/Bcrypt) ๊ตฌํ˜„ ์ „๋žต


๐Ÿงฉ ๋ชฉ์ฐจ

  1. ์„ธ์…˜ ๊ณ ์ •(Session Fixation) ๊ณต๊ฒฉ์ด๋ž€?
  2. ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๋ฐฉ๋ฒ•
  3. ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”๋ž€?
  4. SHA-256 vs Bcrypt ๋น„๊ต
  5. Java ์•”ํ˜ธํ™” ๊ตฌํ˜„ ์˜ˆ์ œ
  6. ์‹ค๋ฌด ๋ณด์•ˆ ํŒ
  7. ๊ธฐ์ˆ  ๋ฉด์ ‘ ๋Œ€๋น„ ํ•ต์‹ฌ ์š”์•ฝ
  8. ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ + Notion ์ž‘์„ฑ ํŒ

โœ… 1. ์„ธ์…˜ ๊ณ ์ •(Session Fixation) ๊ณต๊ฒฉ์ด๋ž€?

ํ•ญ๋ชฉ ์„ค๋ช…
์ •์˜ ๊ณต๊ฒฉ์ž๊ฐ€ ํŠน์ • ์„ธ์…˜ ID๋ฅผ ๋ฏธ๋ฆฌ ๊ณ ์ •์‹œ์ผœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ์œ ๋„ ํ›„, ํ•ด๋‹น ์„ธ์…˜์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ณต๊ฒฉ
๋ฐฉ์‹ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ–ˆ๋Š”๋ฐ, ๊ณต๊ฒฉ์ž๊ฐ€ ๊ฐ™์€ ์„ธ์…˜ ID๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์ง
ํ”ผํ•ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ ์—†์ด ์ ‘๊ทผ ๊ฐ€๋Šฅ (๊ถŒํ•œ ํƒˆ์ทจ)

โœ… 2. ์„ธ์…˜ ๊ณ ์ • ๋ฐฉ์ง€ ๋ฐฉ๋ฒ•

๐Ÿ” ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์„ธ์…˜์„ ๊ฐ•์ œ๋กœ ์ƒˆ๋กœ ๋ฐœ๊ธ‰ (์„ธ์…˜ ์ดˆ๊ธฐํ™” โ†’ ์žฌ์ƒ์„ฑ)

HttpSession oldSession = request.getSession(false);
if (oldSession != null) {
    oldSession.invalidate(); // ๊ธฐ์กด ์„ธ์…˜ ์ œ๊ฑฐ
}

// ์ƒˆ ์„ธ์…˜ ์ƒ์„ฑ ํ›„ ๋กœ๊ทธ์ธ ์ •๋ณด ์ €์žฅ
HttpSession newSession = request.getSession(true);
newSession.setAttribute("loginId", userid);
๐Ÿ›ก๏ธ ํšจ๊ณผ ๊ณต๊ฒฉ์ž๊ฐ€ ์„ธ์…˜์„ ๋ฏธ๋ฆฌ ์•Œ์•„๋„, ๋กœ๊ทธ์ธ ํ›„ ์„ธ์…˜์ด ๋ฐ”๋€Œ๋ฏ€๋กœ ๋ฌด๋ ฅํ™”๋จ

โœ… 3. ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”๋ž€?

ํ•ญ๋ชฉ ์„ค๋ช…
์ •์˜ ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ•ด์‹œํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹
๋ชฉ์  DB๊ฐ€ ์œ ์ถœ๋ผ๋„ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ๋ณดํ˜ธ
์ ˆ๋Œ€ ๊ธˆ์ง€ โŒ ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ, ๋น„๊ตํ•˜์ง€ ๋ง ๊ฒƒ!

โœ… 4. SHA-256 vs Bcrypt ๋น„๊ต

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŠน์ง• ๋ณด์•ˆ์„ฑ ์‚ฌ์šฉ ์šฉ๋„
SHA-256 ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ํ•จ์ˆ˜, ๋น ๋ฆ„ ์ค‘๊ฐ„ (salt ํ•„์š”) ๊ธฐ๋ณธ ์•”ํ˜ธํ™”
Bcrypt ๋А๋ฆฌ์ง€๋งŒ salt ์ž๋™ ํฌํ•จ, ๋ฐ˜๋ณต ์ ์šฉ ๋งค์šฐ ๋†’์Œ ์‹ค์ „ ์„œ๋น„์Šค ๊ถŒ์žฅ

๐Ÿ“Œ ์‹ค๋ฌด์—์„œ๋Š” Bcrypt ์‚ฌ์šฉ ๊ถŒ์žฅ, ์—ฐ์Šต์ด๋‚˜ ๊ฐ„๋‹จํ•œ ์•ฑ์€ SHA-256๋„ OK


โœ… 5. Java ์•”ํ˜ธํ™” ๊ตฌํ˜„ ์˜ˆ์ œ


๐Ÿ” SHA-256 ํ•ด์‹œํ™” ์˜ˆ์ œ

public class EncryptUtil {
  public static String sha256(String pw) throws Exception {
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    byte[] hash = md.digest(pw.getBytes("UTF-8"));

    StringBuilder hexString = new StringBuilder();
    for (byte b : hash) {
      String hex = Integer.toHexString(0xff & b);
      if (hex.length() == 1) hexString.append('0');
      hexString.append(hex);
    }
    return hexString.toString();
  }
}

โœ… ์‚ฌ์šฉ ์˜ˆ (๊ฐ€์ž…/๋กœ๊ทธ์ธ ์‹œ)

String inputPw = request.getParameter("userpw");
String hashedPw = EncryptUtil.sha256(inputPw);

๐Ÿ” Bcrypt ์‚ฌ์šฉ ์˜ˆ (๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•„์š”: BCrypt)

// ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ ์‹œ
String hashedPw = BCrypt.hashpw(rawPw, BCrypt.gensalt());

// ๋กœ๊ทธ์ธ ์‹œ ๋น„๊ต
boolean match = BCrypt.checkpw(inputPw, hashedPw);

โœ… 6. ์‹ค๋ฌด ๋ณด์•ˆ ํŒ ๐Ÿ›ก๏ธ

ํ•ญ๋ชฉ ๋‚ด์šฉ
๋กœ๊ทธ์ธ ์‹œ ์„ธ์…˜ ์žฌ๋ฐœ๊ธ‰ Session Fixation ๋ฐฉ์ง€ (invalidate โ†’ ์žฌ๋ฐœ๊ธ‰)
DB์— ์•”ํ˜ธํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ ํ‰๋ฌธ ์ €์žฅ ๊ธˆ์ง€!
Bcrypt์€ salt ํฌํ•จ โ†’ ๋ณด์•ˆ์„ฑ โ†‘ ๋ฐ˜๋ณต ๊ณ„์‚ฐ์œผ๋กœ brute-force ๊ณต๊ฒฉ ๋ฐฉ์ง€
์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ X โ€œ๋กœ๊ทธ์ธ ์‹คํŒจโ€๋ผ๊ณ ๋งŒ ์ถœ๋ ฅ (ID, PW ๊ตฌ๋ถ„ ์•ˆ ํ•จ)

โœ… 7. ๊ธฐ์ˆ  ๋ฉด์ ‘ ๋Œ€๋น„ ํ•ต์‹ฌ ์š”์•ฝ ๐Ÿ’ฌ

์งˆ๋ฌธ ์š”์  ์ •๋ฆฌ
์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ์ด๋ž€? ๋ฏธ๋ฆฌ ๊ณ ์ •๋œ ์„ธ์…˜ ID๋กœ ๊ณต๊ฒฉ์ž๊ฐ€ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹
๋ฐฉ์ง€ ๋ฐฉ๋ฒ•์€? ๋กœ๊ทธ์ธ ์‹œ ์„ธ์…˜ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์žฌ๋ฐœ๊ธ‰
SHA-256๊ณผ Bcrypt ์ฐจ์ด๋Š”? SHA-256์€ ๋น ๋ฆ„, Bcrypt์€ ๋А๋ฆฌ์ง€๋งŒ salt ํฌํ•จ, ๋ณด์•ˆ โ†‘
์™œ ํ‰๋ฌธ ์ €์žฅ์ด ์œ„ํ—˜ํ•œ๊ฐ€์š”? DB ์œ ์ถœ ์‹œ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ํ•ด์‹œํ™” ํ•„์š”

โœ… 8. ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ ๐Ÿง