** ๐์น ๋ณด์ ๊ธฐ์ด**
์ค๋ฌด ์น ์๋น์ค์์ ๋ฐ๋์ ๊ณ ๋ คํด์ผ ํ 2๊ฐ์ง ํต์ฌ ๋ณด์
๐ก๏ธ ์ธ์
๊ณ ์ (Session Fixation) ๊ณต๊ฒฉ ๋ฐฉ์ง
๐ ๋น๋ฐ๋ฒํธ ์ํธํ(SHA256/Bcrypt) ๊ตฌํ ์ ๋ต
๐งฉ ๋ชฉ์ฐจ
- ์ธ์
๊ณ ์ (Session Fixation) ๊ณต๊ฒฉ์ด๋?
- ์ธ์
๊ณ ์ ๊ณต๊ฒฉ ๋ฐฉ์ง ๋ฐฉ๋ฒ
- ๋น๋ฐ๋ฒํธ ์ํธํ๋?
- SHA-256 vs Bcrypt ๋น๊ต
- Java ์ํธํ ๊ตฌํ ์์
- ์ค๋ฌด ๋ณด์ ํ
- ๊ธฐ์ ๋ฉด์ ๋๋น ํต์ฌ ์์ฝ
- ๋ง๋ฌด๋ฆฌ ์์ฝ + 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. ๋ง๋ฌด๋ฆฌ ์์ฝ ๐ง
- ๐ก๏ธ ์ธ์
๊ณ ์ ๊ณต๊ฒฉ์ ๋ฐ๋์
invalidate()
+ getSession(true)
๋ก ๋ฐฉ์ด
- ๐ ๋น๋ฐ๋ฒํธ๋ ์ ๋ ํ๋ฌธ ์ ์ฅ ๊ธ์ง!
- โ
์ค๋ฌด์์๋ Bcrypt, ์ฐ์ต์์ SHA-256 ์ฌ์ฉ
- ๐ฎ ๋ก๊ทธ์ธ ์ ๋ณด์์ฑ ํ๋ณด๋ ์ฌ์ฉ์ ์ ๋ขฐ๋ฅผ ์ํ ํ์ ์์