์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ›ก๏ธ ์‘์šฉํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณด์•ˆ ์ ๊ฒ€๊ณผ ์ทจ์•ฝ์  ๋ถ„์„ ์‹ค๋ฌด ์™„๋ฒฝ ๊ฐ€์ด๋“œ

๐Ÿ›ก๏ธ ์‘์šฉํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณด์•ˆ ์ ๊ฒ€๊ณผ ์ทจ์•ฝ์  ๋ถ„์„ ์‹ค๋ฌด ์™„๋ฒฝ ๊ฐ€์ด๋“œ

์‹ค์ „์—์„œ ๋ฐ”๋กœ ์จ๋จน๋Š” ๋ณด์•ˆ ์ ๊ฒ€ ๋…ธํ•˜์šฐ์™€ ์ทจ์•ฝ์  ๋ถ„์„ ๊ธฐ๋ฒ•

์•ˆ๋…•, ์นœ๊ตฌ! ๐Ÿ˜Š ์˜ค๋Š˜์€ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  ์‘์šฉํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณด์•ˆ ์ ๊ฒ€๊ณผ ์ทจ์•ฝ์  ๋ถ„์„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณผ๊นŒ ํ•ด. ์š”์ฆ˜ ๋‰ด์Šค ๋ณด๋ฉด ํ•ดํ‚น ์‚ฌ๊ณ ๊ฐ€ ์ •๋ง ๋งŽ์ž–์•„? ๊ฐœ์ธ์ •๋ณด ์œ ์ถœ, ๋žœ์„ฌ์›จ์–ด ๊ณต๊ฒฉ... ์ด๋Ÿฐ ์ผ๋“ค์ด ๋‚จ์˜ ์ผ ๊ฐ™์ง€ ์•Š์ง€? ์‚ฌ์‹ค ์ด๋Ÿฐ ๋ณด์•ˆ ์‚ฌ๊ณ ์˜ ์ƒ๋‹น์ˆ˜๊ฐ€ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์˜ ์ทจ์•ฝ์ ์—์„œ ์‹œ์ž‘๋œ๋‹ค๋Š” ๊ฑฐ ์•Œ๊ณ  ์žˆ์—ˆ์–ด?

ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฑด ์ง‘์„ ์ง“๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด. ์•„๋ฌด๋ฆฌ ๋ฉ‹์ง„ ๋””์ž์ธ๊ณผ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถฐ๋„, ๋ฌธ๊ณผ ์ฐฝ๋ฌธ์— ์ž๋ฌผ์‡ ๊ฐ€ ์—†๋‹ค๋ฉด? ๐Ÿ ๐Ÿ”“ ๋„๋‘‘์ด ์‰ฝ๊ฒŒ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๊ฒ ์ง€. ์‘์šฉํ”„๋กœ๊ทธ๋žจ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์•ผ. ๊ธฐ๋Šฅ์€ ์™„๋ฒฝํ•ด๋„ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ์žˆ๋‹ค๋ฉด ํ•ด์ปค๋“ค์˜ ๋†€์ดํ„ฐ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฌ๋Š” ๊ฑฐ์ง€.

โš ๏ธ ์ทจ์•ฝ์  โœ… ๋ณด์•ˆ๊ฐ•ํ™” ์ฝ”๋“œ ๋ถ„์„ ์ •์ /๋™์  ์นจํˆฌ ํ…Œ์ŠคํŠธ ์‹ค์ „ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ทจ์•ฝ์  ํŒจ์น˜ ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€์†์  ๊ด€๋ฆฌ

๐ŸŽฏ ์™œ ์‘์šฉํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณด์•ˆ์ด ์ค‘์š”ํ• ๊นŒ?

๋จผ์ € ํ˜„์‹ค์ ์ธ ์ด์•ผ๊ธฐ๋ถ€ํ„ฐ ํ•ด๋ณผ๊ฒŒ. 2023๋…„ ํ•œ ํ•ด ๋™์•ˆ ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๋ฐœ์ƒํ•œ ๋ณด์•ˆ ์‚ฌ๊ณ ์˜ ์•ฝ 43%๊ฐ€ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ์ทจ์•ฝ์ ์„ ํ†ตํ•ด ๋ฐœ์ƒํ–ˆ์–ด. ์ด๊ฒŒ ๋ฌด์Šจ ์˜๋ฏธ๋ƒ๋ฉด, ๋„คํŠธ์›Œํฌ ๋ฐฉํ™”๋ฒฝ์ด๋‚˜ ์„œ๋ฒ„ ๋ณด์•ˆ์ด ์•„๋ฌด๋ฆฌ ํŠผํŠผํ•ด๋„ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ์ž์ฒด์— ๊ตฌ๋ฉ์ด ์žˆ์œผ๋ฉด ์†Œ์šฉ์—†๋‹ค๋Š” ๊ฑฐ์ง€.

๐Ÿ’ก ์‹ค์ œ ์‚ฌ๋ก€๋กœ ๋ณด๋Š” ๋ณด์•ˆ ์ทจ์•ฝ์ ์˜ ์œ„ํ—˜์„ฑ 2017๋…„ ์—ํ€ดํŒฉ์Šค(Equifax) ํ•ดํ‚น ์‚ฌ๊ฑด์„ ๊ธฐ์–ตํ•ด? ๋ฏธ๊ตญ์˜ 3๋Œ€ ์‹ ์šฉํ‰๊ฐ€ ํšŒ์‚ฌ ์ค‘ ํ•˜๋‚˜์ธ ์—ํ€ดํŒฉ์Šค๊ฐ€ ํ•ดํ‚น๋‹นํ•ด์„œ ์•ฝ 1์–ต 4์ฒœ๋งŒ ๋ช…์˜ ๊ฐœ์ธ์ •๋ณด๊ฐ€ ์œ ์ถœ๋์–ด. ์›์ธ์€? Apache Struts๋ผ๋Š” ์›น ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ ์„ ํŒจ์น˜ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด์•ผ. ์ด๋ฏธ ํŒจ์น˜๊ฐ€ ๋‚˜์™€ ์žˆ์—ˆ๋Š”๋ฐ๋„ ๋ง์ด์ง€! ์ด ์‚ฌ๊ฑด์œผ๋กœ ํšŒ์‚ฌ๋Š” ์•ฝ 7์–ต ๋‹ฌ๋Ÿฌ(์•ฝ 8์ฒœ์–ต ์›)์˜ ํ•ฉ์˜๊ธˆ์„ ์ง€๋ถˆํ–ˆ์–ด. ๐Ÿ˜ฑ

๊ฐœ๋ฐœ์ž๋กœ์„œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ๋งŒ ์ž˜ ์ž‘๋™ํ•˜๋ฉด ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ. ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•˜๊ณ , ์‹œ์Šคํ…œ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉฐ, ์•…์˜์ ์ธ ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ด. ์ด๊ฒŒ ๋ฐ”๋กœ ์ฑ…์ž„ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž์˜ ์ž์„ธ์ง€.


๐Ÿ” ์‘์šฉํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณด์•ˆ์˜ ํ•ต์‹ฌ ๊ฐœ๋…

๋ณธ๊ฒฉ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—, ์‘์šฉํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณด์•ˆ์—์„œ ๊ผญ ์•Œ์•„์•ผ ํ•  ํ•ต์‹ฌ ๊ฐœ๋…๋“ค์„ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ. ์ด ๊ฐœ๋…๋“ค์€ ์•ž์œผ๋กœ ๊ณ„์† ๋‚˜์˜ฌ ๊ฑฐ๋‹ˆ๊นŒ ์ž˜ ๊ธฐ์–ตํ•ด๋‘๋ฉด ์ข‹์•„! ๐Ÿ“š

๐Ÿ›ก๏ธ CIA ํŠธ๋ผ์ด์–ด๋“œ (๋ณด์•ˆ์˜ 3๋Œ€ ์›์น™)

๋ณด์•ˆ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ์„ธ ๊ฐ€์ง€ ์›์น™์ด์•ผ:

1. Confidentiality (๊ธฐ๋ฐ€์„ฑ) ๐Ÿ”’
์ธ๊ฐ€๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ •๋ณด์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์—†์–ด์•ผ ํ•ด.
2. Integrity (๋ฌด๊ฒฐ์„ฑ) โœ…
๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด๋‹จ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์†์ƒ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ. ์†ก๊ธˆ ๊ธˆ์•ก์ด ์ค‘๊ฐ„์— ๋ฐ”๋€Œ๋ฉด ์•ˆ ๋˜๊ฒ ์ง€?
3. Availability (๊ฐ€์šฉ์„ฑ) ๐ŸŒ
์ธ๊ฐ€๋œ ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์–ธ์ œ๋“ ์ง€ ์‹œ์Šคํ…œ๊ณผ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ด. DDoS ๊ณต๊ฒฉ์œผ๋กœ ์„œ๋น„์Šค๊ฐ€ ๋งˆ๋น„๋˜๋ฉด ๊ฐ€์šฉ์„ฑ์ด ์นจํ•ด๋œ ๊ฑฐ์•ผ.

๐ŸŽญ ๊ณต๊ฒฉ์ž์˜ ๊ด€์ ์—์„œ ์ƒ๊ฐํ•˜๊ธฐ

๋ณด์•ˆ์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ ค๋ฉด ๊ณต๊ฒฉ์ž์ฒ˜๋Ÿผ ์ƒ๊ฐํ•  ์ค„ ์•Œ์•„์•ผ ํ•ด. ์ด๊ฑธ "ํ•ด์ปค์˜ ๋งˆ์ธ๋“œ์…‹"์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๋‚ด๊ฐ€ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์„ ์–ด๋–ป๊ฒŒ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์ƒ์ƒํ•ด๋ณด๋Š” ๊ฑฐ์ง€. ๐Ÿค”

๐ŸŽฏ ๊ณต๊ฒฉ์ž๊ฐ€ ๋…ธ๋ฆฌ๋Š” ๊ฒƒ๋“ค: ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ ๋ถ€์žฌ ์ธ์ฆ/์ธ๊ฐ€ ์šฐํšŒ ์„ธ์…˜ ํƒˆ์ทจ ๊ถŒํ•œ ์ƒ์Šน ๋ฐ์ดํ„ฐ ์œ ์ถœ ์„œ๋น„์Šค ๊ฑฐ๋ถ€

๐Ÿ” ์ฃผ์š” ๋ณด์•ˆ ์ทจ์•ฝ์  ์œ ํ˜• TOP 10

OWASP(Open Web Application Security Project)๋ผ๋Š” ๊ตญ์ œ ๋ณด์•ˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋งค๋…„ ๋ฐœํ‘œํ•˜๋Š” "OWASP Top 10"์ด๋ผ๋Š” ๊ฒŒ ์žˆ์–ด. ๊ฐ€์žฅ ์œ„ํ—˜ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ์ทจ์•ฝ์  10๊ฐ€์ง€๋ฅผ ์ •๋ฆฌํ•œ ๊ฑด๋ฐ, ์ด๊ฑด ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ํ•„์ˆ˜๋กœ ์•Œ์•„์•ผ ํ•ด! ๊ฐ๊ฐ์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž. ๐ŸŽ“

1๏ธโƒฃ ์ธ์ ์…˜ (Injection)

์ธ์ ์…˜์€ ๊ฐ€์žฅ ์œ„ํ—˜ํ•˜๊ณ  ํ”ํ•œ ์ทจ์•ฝ์  ์ค‘ ํ•˜๋‚˜์•ผ. ๊ณต๊ฒฉ์ž๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ช…๋ น์–ด๋‚˜ ์ฟผ๋ฆฌ์˜ ์ผ๋ถ€๋กœ ์ „์†กํ•ด์„œ, ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ช…๋ น์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฑฐ์ง€.

๐Ÿ’‰ SQL Injection ์˜ˆ์‹œ

์ทจ์•ฝํ•œ ์ฝ”๋“œ๋ฅผ ๋ณผ๊นŒ?

// ์ทจ์•ฝํ•œ ์ฝ”๋“œ โŒ
String query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);

์ด ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ ์€ ๋ญ˜๊นŒ? ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ฟผ๋ฆฌ์— ๋„ฃ๊ณ  ์žˆ์–ด. ๋งŒ์•ฝ ๊ณต๊ฒฉ์ž๊ฐ€ username์— ' OR '1'='1์„ ์ž…๋ ฅํ•˜๋ฉด?

SELECT * FROM users WHERE username='' OR '1'='1' AND password=''

์ด๋ ‡๊ฒŒ ๋˜๋ฉด์„œ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์กฐํšŒ๋ผ๋ฒ„๋ ค! ๐Ÿ˜ฑ '1'='1'์€ ํ•ญ์ƒ ์ฐธ์ด๋‹ˆ๊นŒ.

โœ… ์•ˆ์ „ํ•œ ์ฝ”๋“œ

Prepared Statement๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ:
String query = "SELECT * FROM users WHERE username=? AND password=?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž…๋ ฅ๊ฐ’์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ”์ธ๋”ฉ๋˜์–ด์„œ SQL ๋ช…๋ น์–ด๋กœ ํ•ด์„๋˜์ง€ ์•Š์•„. ๐Ÿ‘
โš ๏ธ ๋‹ค๋ฅธ ์ธ์ ์…˜ ์œ ํ˜•๋“ค โ€ข OS Command Injection: ์‹œ์Šคํ…œ ๋ช…๋ น์–ด ์‹คํ–‰
โ€ข LDAP Injection: LDAP ์ฟผ๋ฆฌ ์กฐ์ž‘
โ€ข XPath Injection: XML ๋ฐ์ดํ„ฐ ์กฐ์ž‘
โ€ข NoSQL Injection: NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณต๊ฒฉ

2๏ธโƒฃ ์ทจ์•ฝํ•œ ์ธ์ฆ (Broken Authentication)

์ธ์ฆ๊ณผ ์„ธ์…˜ ๊ด€๋ฆฌ๊ฐ€ ์ œ๋Œ€๋กœ ๊ตฌํ˜„๋˜์ง€ ์•Š์œผ๋ฉด, ๊ณต๊ฒฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •์„ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฑด ์ •๋ง ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ์ง€! ๐Ÿ”‘

๐Ÿšจ ํ”ํ•œ ์ธ์ฆ ์ทจ์•ฝ์ ๋“ค:
์•ฝํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ •์ฑ…
"123456", "password" ๊ฐ™์€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ์•ˆ ๋ผ. ์ตœ์†Œ 8์ž ์ด์ƒ, ๋Œ€์†Œ๋ฌธ์ž/์ˆซ์ž/ํŠน์ˆ˜๋ฌธ์ž ์กฐํ•ฉ์„ ์š”๊ตฌํ•ด์•ผ ํ•ด.
ํฌ๋ฆฌ๋ด์…œ ์Šคํ„ฐํ•‘ (Credential Stuffing)
์œ ์ถœ๋œ ๊ณ„์ • ์ •๋ณด๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ์‹œ๋„ํ•˜๋Š” ๊ณต๊ฒฉ. ๋กœ๊ทธ์ธ ์‹œ๋„ ํšŸ์ˆ˜ ์ œํ•œ๊ณผ CAPTCHA๋กœ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์–ด.
์„ธ์…˜ ID ๋…ธ์ถœ
URL์— ์„ธ์…˜ ID๋ฅผ ํฌํ•จ์‹œํ‚ค๋ฉด ์•ˆ ๋ผ! ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ๋‚˜ Referer ํ—ค๋”๋ฅผ ํ†ตํ•ด ์œ ์ถœ๋  ์ˆ˜ ์žˆ๊ฑฐ๋“ .
// ๋‚˜์œ ์˜ˆ โŒ
http://example.com/page?sessionid=abc123

// ์ข‹์€ ์˜ˆ โœ…
์ฟ ํ‚ค์— HttpOnly, Secure ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์ €์žฅ
์„ธ์…˜ ํƒ€์ž„์•„์›ƒ ๋ฏธ์„ค์ •
์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒํ•˜์ง€ ์•Š๊ณ  ์ž๋ฆฌ๋ฅผ ๋น„์› ์„ ๋•Œ๋ฅผ ๋Œ€๋น„ํ•ด ์ผ์ • ์‹œ๊ฐ„ ํ›„ ์ž๋™ ๋กœ๊ทธ์•„์›ƒ๋˜๋„๋ก ํ•ด์•ผ ํ•ด.

๋‹ค์ค‘ ์ธ์ฆ(MFA)์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ. ๋น„๋ฐ€๋ฒˆํ˜ธ ์™ธ์— SMS ์ธ์ฆ, OTP, ์ƒ์ฒด์ธ์ฆ ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ณด์•ˆ์ด ํ›จ์”ฌ ๊ฐ•ํ™”๋ผ. ๐Ÿ“ฑ

3๏ธโƒฃ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ๋…ธ์ถœ (Sensitive Data Exposure)

๊ฐœ์ธ์ •๋ณด, ์‹ ์šฉ์นด๋“œ ๋ฒˆํ˜ธ, ์˜๋ฃŒ ๊ธฐ๋ก ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๋Œ€๋กœ ๋ณดํ˜ธ๋˜์ง€ ์•Š์œผ๋ฉด ํฐ์ผ ๋‚˜! ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ๋Š” ์ €์žฅํ•  ๋•Œ๋„, ์ „์†กํ•  ๋•Œ๋„ ์•”ํ˜ธํ™”ํ•ด์•ผ ํ•ด. ๐Ÿ”

๐Ÿ”’ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ์ฒดํฌ๋ฆฌ์ŠคํŠธ: 1. ์ „์†ก ์ค‘ ์•”ํ˜ธํ™” (Encryption in Transit)
โ€ข HTTPS ์‚ฌ์šฉ (TLS 1.2 ์ด์ƒ)
โ€ข HTTP Strict Transport Security (HSTS) ํ—ค๋” ์„ค์ •
โ€ข ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ GET ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „์†กํ•˜์ง€ ์•Š๊ธฐ

2. ์ €์žฅ ์‹œ ์•”ํ˜ธํ™” (Encryption at Rest)
โ€ข ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•”ํ˜ธํ™”
โ€ข ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋ฐ˜๋“œ์‹œ ํ•ด์‹œ ์ฒ˜๋ฆฌ (bcrypt, Argon2 ์‚ฌ์šฉ)
โ€ข ์•”ํ˜ธํ™” ํ‚ค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ์‚ฌ์šฉ

3. ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๊ธˆ์ง€
โ€ข ๊ผญ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ง‘ํ•˜๊ณ  ์ €์žฅ
โ€ข ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ์‚ญ์ œ
๐Ÿ’Ž ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹ฑ ์˜ˆ์‹œ
// ์ ˆ๋Œ€ ์ด๋ ‡๊ฒŒ ํ•˜์ง€ ๋งˆ! โŒ
String hashedPassword = MD5(password);

// bcrypt ์‚ฌ์šฉ โœ…
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String hashedPassword = encoder.encode(password);

// ๊ฒ€์ฆ
boolean matches = encoder.matches(rawPassword, hashedPassword);

MD5๋‚˜ SHA-1 ๊ฐ™์€ ์˜ค๋ž˜๋œ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด์ œ ์•ˆ์ „ํ•˜์ง€ ์•Š์•„. bcrypt, scrypt, Argon2 ๊ฐ™์€ ๋А๋ฆฐ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ด. ์™œ ๋А๋ ค์•ผ ํ•˜๋ƒ๊ณ ? ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๊ณต๊ฒฉ(brute force)์„ ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ์•ผ! ๐ŸŒ

4๏ธโƒฃ XML ์™ธ๋ถ€ ๊ฐœ์ฒด (XXE - XML External Entities)

XML ํŒŒ์„œ๊ฐ€ ์™ธ๋ถ€ ๊ฐœ์ฒด ์ฐธ์กฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์ด์•ผ. ๊ณต๊ฒฉ์ž๊ฐ€ ์„œ๋ฒ„์˜ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜, ๋‚ด๋ถ€ ์‹œ์Šคํ…œ์„ ์Šค์บ”ํ•˜๊ฑฐ๋‚˜, ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ์„ ํ•  ์ˆ˜ ์žˆ์–ด.

๐ŸŽฏ XXE ๊ณต๊ฒฉ ์˜ˆ์‹œ
<!-- ์•…์˜์ ์ธ XML -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>
โœ… ๋ฐฉ์–ด ๋ฐฉ๋ฒ•

XML ํŒŒ์„œ ์„ค์ •์—์„œ ์™ธ๋ถ€ ๊ฐœ์ฒด ์ฒ˜๋ฆฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ด:
// Java ์˜ˆ์‹œ
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

5๏ธโƒฃ ์ทจ์•ฝํ•œ ์ ‘๊ทผ ํ†ต์ œ (Broken Access Control)

์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๊ถŒํ•œ์„ ๋„˜์–ด์„œ๋Š” ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด? ๊ทธ๊ฑด ํฐ ๋ฌธ์ œ์•ผ! ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ/์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์•ˆ ๋˜๊ฒ ์ง€? ๐Ÿšซ

๐Ÿ”“ ํ”ํ•œ ์ ‘๊ทผ ํ†ต์ œ ์‹ค์ˆ˜๋“ค: 1. IDOR (Insecure Direct Object Reference)
URL์ด๋‚˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐ์ž‘ํ•ด์„œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ:
// ์ทจ์•ฝํ•œ ์˜ˆ โŒ
http://example.com/user/profile?id=123
โ†’ id๋ฅผ 124๋กœ ๋ฐ”๊พธ๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ ํ”„๋กœํ•„์ด ๋ณด์ž„!

// ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• โœ…
// ์„œ๋ฒ„์—์„œ ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์—
// ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ๋ฐ˜๋“œ์‹œ ํ™•์ธ
2. ์ˆ˜์ง์  ๊ถŒํ•œ ์ƒ์Šน
์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ์— ์ ‘๊ทผ:
// ๋ชจ๋“  ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ ๊ถŒํ•œ ์ฒดํฌ ํ•„์ˆ˜!
@PreAuthorize("hasRole('ADMIN')")
public String adminPage() {
// ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ
}
3. ์ˆ˜ํ‰์  ๊ถŒํ•œ ์ƒ์Šน
๊ฐ™์€ ๊ถŒํ•œ ๋ ˆ๋ฒจ์˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ:
// ํ•ญ์ƒ ์†Œ์œ ๊ถŒ ํ™•์ธ!
if (!document.getOwnerId().equals(currentUser.getId())) {
throw new AccessDeniedException("๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค");
}

6๏ธโƒฃ ๋ณด์•ˆ ์„ค์ • ์˜ค๋ฅ˜ (Security Misconfiguration)

๊ธฐ๋ณธ ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๋ถˆ์™„์ „ํ•œ ์„ค์ •, ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” ๋“ฑ์ด ์ด ๋ฒ”์ฃผ์— ์†ํ•ด. ์˜์™ธ๋กœ ์ด๋Ÿฐ ๋‹จ์ˆœํ•œ ์‹ค์ˆ˜๊ฐ€ ํฐ ๋ณด์•ˆ ์‚ฌ๊ณ ๋กœ ์ด์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„! ๐Ÿ˜…

โš ๏ธ ์ฒดํฌํ•ด์•ผ ํ•  ๋ณด์•ˆ ์„ค์ •๋“ค: โ€ข ๊ธฐ๋ณธ ๊ณ„์ •๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ (admin/admin ๊ฐ™์€ ๊ฑฐ!)
โ€ข ๋ถˆํ•„์š”ํ•œ ์„œ๋น„์Šค์™€ ํฌํŠธ ๋น„ํ™œ์„ฑํ™”
โ€ข ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์—์„œ ๋ฏผ๊ฐํ•œ ์ •๋ณด ์ œ๊ฑฐ
โ€ข ๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŒ… ๋น„ํ™œ์„ฑํ™”
โ€ข ์ตœ์‹  ๋ณด์•ˆ ํŒจ์น˜ ์ ์šฉ
โ€ข ๊ฐœ๋ฐœ/๋””๋ฒ„๊ทธ ๋ชจ๋“œ ๋น„ํ™œ์„ฑํ™” (ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ)
๐ŸŽฏ ์‹ค์ „ ์˜ˆ์‹œ: ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ
// ๋‚˜์œ ์˜ˆ โŒ
catch (Exception e) {
return "Error: " + e.getMessage() + "\nStack trace: " + e.getStackTrace();
}
// ๊ณต๊ฒฉ์ž์—๊ฒŒ ์‹œ์Šคํ…œ ๊ตฌ์กฐ ์ •๋ณด๋ฅผ ์ œ๊ณต!

// ์ข‹์€ ์˜ˆ โœ…
catch (Exception e) {
logger.error("Error occurred", e); // ๋กœ๊ทธ์—๋งŒ ์ƒ์„ธ ์ •๋ณด ๊ธฐ๋ก
return "์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ฌธ์˜ํ•˜์„ธ์š”.";
}

7๏ธโƒฃ ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ… (XSS - Cross-Site Scripting)

XSS๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์›น ํŽ˜์ด์ง€์— ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•ด์„œ, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๋Š” ๊ณต๊ฒฉ์ด์•ผ. ์ด๋ฅผ ํ†ตํ•ด ์ฟ ํ‚ค๋ฅผ ํ›”์น˜๊ฑฐ๋‚˜, ์„ธ์…˜์„ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž๋ฅผ ์†์ผ ์ˆ˜ ์žˆ์–ด. ๐ŸŽญ

๐Ÿ” XSS์˜ ์„ธ ๊ฐ€์ง€ ์œ ํ˜•
1. Reflected XSS (๋ฐ˜์‚ฌํ˜•)
์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ์ฆ‰์‹œ ์‘๋‹ต์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ:
// ์ทจ์•ฝํ•œ ์ฝ”๋“œ โŒ
String search = request.getParameter("q");
response.getWriter().write("๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ: " + search);

// ๊ณต๊ฒฉ URL
http://example.com/search?q=<script>alert(document.cookie)</script>
2. Stored XSS (์ €์žฅํ˜•)
์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์–ด, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณ„์† ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ. ๊ฒŒ์‹œํŒ ๋Œ“๊ธ€ ๊ฐ™์€ ๊ณณ์—์„œ ๋งŽ์ด ๋ฐœ์ƒํ•ด.
3. DOM-based XSS
ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript์—์„œ ๋ฐœ์ƒํ•˜๋Š” XSS:
// ์ทจ์•ฝํ•œ ์ฝ”๋“œ โŒ
document.getElementById("welcome").innerHTML =
"ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค, " + location.hash.substring(1);
โœ… XSS ๋ฐฉ์–ด ๋ฐฉ๋ฒ•

1. ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ ๋ฐ ์ถœ๋ ฅ ์ธ์ฝ”๋”ฉ
// HTML ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ
import org.apache.commons.text.StringEscapeUtils;

String safe = StringEscapeUtils.escapeHtml4(userInput);

// ๋˜๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„ ์‚ฌ์šฉ (์ž๋™ ์ด์Šค์ผ€์ดํ”„)
// Thymeleaf, JSP์˜ c:out ๋“ฑ
2. Content Security Policy (CSP) ํ—ค๋” ์„ค์ •
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-random123'
3. HttpOnly ์ฟ ํ‚ค ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ
Cookie cookie = new Cookie("sessionId", sessionId);
cookie.setHttpOnly(true); // JavaScript์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€
cookie.setSecure(true); // HTTPS์—์„œ๋งŒ ์ „์†ก

8๏ธโƒฃ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์—ญ์ง๋ ฌํ™” (Insecure Deserialization)

์ง๋ ฌํ™”๋œ ๊ฐ์ฒด๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์†Œ์Šค์—์„œ ๋ฐ›์•„์„œ ์—ญ์ง๋ ฌํ™”ํ•˜๋ฉด, ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰์ด๋‚˜ ๊ถŒํ•œ ์ƒ์Šน ๊ฐ™์€ ์‹ฌ๊ฐํ•œ ๊ณต๊ฒฉ์„ ๋‹นํ•  ์ˆ˜ ์žˆ์–ด. ๐Ÿ˜ฐ

๐ŸŽฏ ์—ญ์ง๋ ฌํ™” ์ทจ์•ฝ์  ์˜ˆ์‹œ
// ์œ„ํ—˜ํ•œ ์ฝ”๋“œ โŒ
ObjectInputStream ois = new ObjectInputStream(untrustedInputStream);
Object obj = ois.readObject(); // ์•…์˜์ ์ธ ๊ฐ์ฒด๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Œ!

// ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ• โœ…
// 1. ์—ญ์ง๋ ฌํ™” ๋Œ€์‹  JSON ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํฌ๋งท ์‚ฌ์šฉ
// 2. ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์—ญ์ง๋ ฌํ™” ํ•„ํ„ฐ ์ ์šฉ
// 3. ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ (HMAC ๋“ฑ)

9๏ธโƒฃ ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ ์ด ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ

์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ์ข‹์ง€๋งŒ, ์ทจ์•ฝ์ ์ด ์žˆ๋Š” ์˜ค๋ž˜๋œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ„ํ—˜ํ•ด! ์ •๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ทจ์•ฝ์ ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•ด. ๐Ÿ“ฆ

๐Ÿ”ง ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋„๊ตฌ๋“ค OWASP Dependency-Check Snyk npm audit Maven Dependency Plugin GitHub Dependabot
# npm ํ”„๋กœ์ ํŠธ ์ทจ์•ฝ์  ๊ฒ€์‚ฌ
npm audit

# ์ž๋™ ์ˆ˜์ •
npm audit fix

# Maven ํ”„๋กœ์ ํŠธ
mvn dependency-check:check

๐Ÿ”Ÿ ๋ถˆ์ถฉ๋ถ„ํ•œ ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

๊ณต๊ฒฉ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜, ์‚ฌํ›„ ๋ถ„์„์„ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด? ๊ทธ๊ฑด ์ •๋ง ๋‹ต๋‹ตํ•œ ์ƒํ™ฉ์ด์•ผ. ์ ์ ˆํ•œ ๋กœ๊น…๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง์€ ๋ณด์•ˆ์˜ ๋งˆ์ง€๋ง‰ ๋ฐฉ์–ด์„ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์–ด! ๐Ÿ“Š

๐Ÿ“ ๋กœ๊น…ํ•ด์•ผ ํ•  ๋ณด์•ˆ ์ด๋ฒคํŠธ๋“ค: โ€ข ๋กœ๊ทธ์ธ ์„ฑ๊ณต/์‹คํŒจ (ํŠนํžˆ ๋ฐ˜๋ณต๋œ ์‹คํŒจ)
โ€ข ๊ถŒํ•œ ๋ณ€๊ฒฝ
โ€ข ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ
โ€ข ์ž…๋ ฅ ๊ฒ€์ฆ ์‹คํŒจ
โ€ข ์ธ์ฆ/์ธ๊ฐ€ ์‹คํŒจ
โ€ข ์„œ๋ฒ„ ์ธก ์—๋Ÿฌ

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ: ๋กœ๊ทธ์— ๋น„๋ฐ€๋ฒˆํ˜ธ, ์‹ ์šฉ์นด๋“œ ๋ฒˆํ˜ธ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋ฉด ์•ˆ ๋ผ!

๐Ÿ› ๏ธ ๋ณด์•ˆ ์ ๊ฒ€ ์‹ค๋ฌด ํ”„๋กœ์„ธ์Šค

์ด์ œ ์‹ค์ œ๋กœ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์˜ ๋ณด์•ˆ์„ ์ ๊ฒ€ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์•Œ์•„๋ณด์ž. ์ด๊ฑด ๋‚ด๊ฐ€ ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ๋„ ํ•ด! ๐Ÿ’ผ

๋ณด์•ˆ ์ ๊ฒ€ ํ”„๋กœ์„ธ์Šค 1 ๊ณ„ํš ์ˆ˜๋ฆฝ 2 ์ •๋ณด ์ˆ˜์ง‘ 3 ์ทจ์•ฝ์  ๋ถ„์„ 4 ์นจํˆฌ ํ…Œ์ŠคํŠธ 5 ๋ณด๊ณ ์„œ ์ž‘์„ฑ 6 ๊ฐœ์„  ์กฐ์น˜ ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ฐœ์„ 

๐Ÿ“‹ 1๋‹จ๊ณ„: ๊ณ„ํš ์ˆ˜๋ฆฝ

๋ณด์•ˆ ์ ๊ฒ€์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ช…ํ™•ํ•œ ๊ณ„ํš์ด ํ•„์š”ํ•ด. ๋ฌด์ž‘์ • ์‹œ์ž‘ํ•˜๋ฉด ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ๋†“์น  ์ˆ˜ ์žˆ๊ฑฐ๋“ ! ๐ŸŽฏ

๐Ÿ“ ๊ณ„ํš ์ˆ˜๋ฆฝ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
์ ๊ฒ€ ๋ฒ”์œ„ ์ •์˜
โ€ข ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜/๋ชจ๋“ˆ์„ ์ ๊ฒ€ํ•  ๊ฒƒ์ธ๊ฐ€?
โ€ข ์›น, ๋ชจ๋ฐ”์ผ, API ๋“ฑ ์–ด๋–ค ํ”Œ๋žซํผ์ธ๊ฐ€?
โ€ข ๋‚ด๋ถ€๋ง, ์™ธ๋ถ€๋ง ์ค‘ ์–ด๋””๋ฅผ ์ ๊ฒ€ํ•  ๊ฒƒ์ธ๊ฐ€?
์ ๊ฒ€ ๋ชฉํ‘œ ์„ค์ •
โ€ข ์ปดํ”Œ๋ผ์ด์–ธ์Šค ์ค€์ˆ˜ (ISMS-P, ISO 27001 ๋“ฑ)
โ€ข ํŠน์ • ์ทจ์•ฝ์  ๊ฒ€์ฆ
โ€ข ์ „๋ฐ˜์ ์ธ ๋ณด์•ˆ ์ˆ˜์ค€ ํ‰๊ฐ€
์ผ์ • ๋ฐ ๋ฆฌ์†Œ์Šค ๊ณ„ํš
โ€ข ์ ๊ฒ€ ๊ธฐ๊ฐ„: ๋ณดํ†ต 1~4์ฃผ
โ€ข ์ฐธ์—ฌ ์ธ์›: ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€, ๊ฐœ๋ฐœ์ž, ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž
โ€ข ํ•„์š”ํ•œ ๋„๊ตฌ ๋ฐ ํ™˜๊ฒฝ
์Šน์ธ ๋ฐ ๋ฒ•์  ๊ณ ๋ ค์‚ฌํ•ญ
โ€ข ์นจํˆฌ ํ…Œ์ŠคํŠธ ์Šน์ธ์„œ ํ™•๋ณด
โ€ข ํ…Œ์ŠคํŠธ ๋ฒ”์œ„ ๋ฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ•ฉ์˜
โ€ข ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ๋ฐ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ ๋ฐฉ์นจ ํ™•์ธ

๐Ÿ”Ž 2๋‹จ๊ณ„: ์ •๋ณด ์ˆ˜์ง‘ (Reconnaissance)

๊ณต๊ฒฉ์ž์˜ ๊ด€์ ์—์„œ ๋Œ€์ƒ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋‹จ๊ณ„์•ผ. ์ด ์ •๋ณด๋“ค์ด ๋‚˜์ค‘์— ์ทจ์•ฝ์ ์„ ์ฐพ๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ผ! ๐Ÿ•ต๏ธ

๐ŸŽฏ ์ˆ˜์ง‘ํ•ด์•ผ ํ•  ์ •๋ณด๋“ค: 1. ๊ธฐ์ˆ  ์Šคํƒ ํŒŒ์•…
โ€ข ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ
โ€ข ์›น ์„œ๋ฒ„ (Apache, Nginx, IIS ๋“ฑ)
โ€ข ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (MySQL, PostgreSQL, MongoDB ๋“ฑ)
โ€ข ์‚ฌ์šฉ ์ค‘์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋ฒ„์ „

2. ๋„คํŠธ์›Œํฌ ์ •๋ณด
โ€ข ๋„๋ฉ”์ธ ๋ฐ ์„œ๋ธŒ๋„๋ฉ”์ธ
โ€ข IP ์ฃผ์†Œ ๋ฒ”์œ„
โ€ข ์—ด๋ฆฐ ํฌํŠธ ๋ฐ ์„œ๋น„์Šค

3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ
โ€ข URL ๊ตฌ์กฐ ๋ฐ ์—”๋“œํฌ์ธํŠธ
โ€ข ์ž…๋ ฅ ํ•„๋“œ ๋ฐ ํŒŒ๋ผ๋ฏธํ„ฐ
โ€ข ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ
โ€ข API ๋ฌธ์„œ
๐Ÿ› ๏ธ ์ •๋ณด ์ˆ˜์ง‘ ๋„๊ตฌ๋“ค
# Nmap - ํฌํŠธ ์Šค์บ๋‹
nmap -sV -sC target.com

# Sublist3r - ์„œ๋ธŒ๋„๋ฉ”์ธ ์ฐพ๊ธฐ
python sublist3r.py -d target.com

# WhatWeb - ์›น ๊ธฐ์ˆ  ํƒ์ง€
whatweb target.com

# Wappalyzer - ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ธฐ์ˆ  ์Šคํƒ ํ™•์ธ

๐Ÿ”ฌ 3๋‹จ๊ณ„: ์ทจ์•ฝ์  ๋ถ„์„

์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ทจ์•ฝ์ ์„ ์ฐพ์•„๋ณผ ์‹œ๊ฐ„์ด์•ผ! ํฌ๊ฒŒ ์ •์  ๋ถ„์„๊ณผ ๋™์  ๋ถ„์„ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด.

๐Ÿ“„ ์ •์  ๋ถ„์„ (SAST - Static Application Security Testing)

์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ถ„์„ํ•ด์„œ ์ทจ์•ฝ์ ์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด์•ผ. ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์œ ์šฉํ•ด! ๐Ÿ‘จโ€๐Ÿ’ป

์žฅ์ :
โ€ข ๊ฐœ๋ฐœ ์ดˆ๊ธฐ์— ์ทจ์•ฝ์  ๋ฐœ๊ฒฌ ๊ฐ€๋Šฅ
โ€ข ์ •ํ™•ํ•œ ์œ„์น˜ ํŒŒ์•… (ํŒŒ์ผ๋ช…, ๋ผ์ธ ๋ฒˆํ˜ธ)
โ€ข ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค ๊ฒ€์‚ฌ ๊ฐ€๋Šฅ
โ€ข False Positive๊ฐ€ ์ ์Œ
๋‹จ์ :
โ€ข ๋Ÿฐํƒ€์ž„ ์ทจ์•ฝ์  ๋ฐœ๊ฒฌ ์–ด๋ ค์›€
โ€ข ์„ค์ • ์˜ค๋ฅ˜ ํƒ์ง€ ์ œํ•œ์ 
โ€ข ์–ธ์–ด๋ณ„ ๋„๊ตฌ ํ•„์š”
๐Ÿ”ง ์ •์  ๋ถ„์„ ๋„๊ตฌ๋“ค:

SonarQube Checkmarx Fortify Veracode ESLint (JavaScript) Bandit (Python) FindBugs (Java)
# SonarQube ์‹คํ–‰ ์˜ˆ์‹œ
mvn sonar:sonar \
-Dsonar.projectKey=my-project \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login=your-token

๐ŸŽฎ ๋™์  ๋ถ„์„ (DAST - Dynamic Application Security Testing)

์‹ค์ œ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด์„œ ์™ธ๋ถ€์—์„œ ๊ณต๊ฒฉ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์•ผ. ๋ธ”๋ž™๋ฐ•์Šค ํ…Œ์ŠคํŠธ๋ผ๊ณ ๋„ ํ•ด. ๐ŸŽญ

์žฅ์ :
โ€ข ์‹ค์ œ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ
โ€ข ์„ค์ • ์˜ค๋ฅ˜ ๋ฐ ํ™˜๊ฒฝ ๋ฌธ์ œ ๋ฐœ๊ฒฌ
โ€ข ์†Œ์Šค ์ฝ”๋“œ ์—†์ด๋„ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
โ€ข ์‹ค์ œ ๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค ์žฌํ˜„
๋‹จ์ :
โ€ข ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ์ œํ•œ์ 
โ€ข False Positive ๋งŽ์Œ
โ€ข ์ •ํ™•ํ•œ ์œ„์น˜ ํŒŒ์•… ์–ด๋ ค์›€
โ€ข ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„ ์˜ค๋ž˜ ๊ฑธ๋ฆผ
๐Ÿ”ง ๋™์  ๋ถ„์„ ๋„๊ตฌ๋“ค:

OWASP ZAP Burp Suite Acunetix Netsparker AppScan
๐Ÿ’ก Pro Tip: ์ •์  ๋ถ„์„๊ณผ ๋™์  ๋ถ„์„์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๋„ˆ์ง€ ํšจ๊ณผ๊ฐ€ ์ปค! ์ด๊ฑธ IAST (Interactive Application Security Testing)๋ผ๊ณ  ํ•ด. ๋‘ ๋ฐฉ๋ฒ•์˜ ์žฅ์ ์„ ๊ฒฐํ•ฉํ•œ ๊ฑฐ์ง€. ๐ŸŽฏ

โš”๏ธ 4๋‹จ๊ณ„: ์นจํˆฌ ํ…Œ์ŠคํŠธ (Penetration Testing)

์ด์ œ ์ง„์งœ ํ•ด์ปค์ฒ˜๋Ÿผ ์‹œ์Šคํ…œ์„ ๊ณต๊ฒฉํ•ด๋ณด๋Š” ๋‹จ๊ณ„์•ผ! ๋ฌผ๋ก  ํ—ˆ๊ฐ€๋ฐ›์€ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ํ•ด์•ผ ํ•ด. ๐Ÿ˜Ž

๐ŸŽฏ ์นจํˆฌ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๋ก 
1. ์ธ์ฆ ๋ฐ ์„ธ์…˜ ๊ด€๋ฆฌ ํ…Œ์ŠคํŠธ
โ€ข ์•ฝํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ •์ฑ… ํ™•์ธ
โ€ข ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๊ณต๊ฒฉ ์‹œ๋„
โ€ข ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ
โ€ข ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ ํ™•์ธ
โ€ข Remember Me ๊ธฐ๋Šฅ ๋ณด์•ˆ ๊ฒ€์ฆ
2. ์ž…๋ ฅ ๊ฒ€์ฆ ํ…Œ์ŠคํŠธ
โ€ข SQL Injection ์‹œ๋„
โ€ข XSS ๊ณต๊ฒฉ ์‹œ๋„
โ€ข Command Injection
โ€ข Path Traversal
โ€ข File Upload ์ทจ์•ฝ์ 
3. ๊ถŒํ•œ ๋ฐ ์ ‘๊ทผ ํ†ต์ œ ํ…Œ์ŠคํŠธ
โ€ข ์ˆ˜์ง์  ๊ถŒํ•œ ์ƒ์Šน ์‹œ๋„
โ€ข ์ˆ˜ํ‰์  ๊ถŒํ•œ ์ƒ์Šน ์‹œ๋„
โ€ข IDOR ์ทจ์•ฝ์  ํ™•์ธ
โ€ข API ์—”๋“œํฌ์ธํŠธ ๋ฌด๋‹จ ์ ‘๊ทผ
4. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ…Œ์ŠคํŠธ
โ€ข ๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค ์šฐํšŒ
โ€ข ์ฟ ํฐ/ํฌ์ธํŠธ ์ค‘๋ณต ์‚ฌ์šฉ
โ€ข ์žฌ๊ณ  ๊ด€๋ฆฌ ๋กœ์ง ์˜ค๋ฅ˜
โ€ข ๊ฒฝ์Ÿ ์กฐ๊ฑด(Race Condition) ๊ณต๊ฒฉ
5. ํด๋ผ์ด์–ธํŠธ ์ธก ๋ณด์•ˆ ํ…Œ์ŠคํŠธ
โ€ข JavaScript ์ฝ”๋“œ ๋ถ„์„
โ€ข ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€/์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€ ํ™•์ธ
โ€ข CORS ์„ค์ • ๊ฒ€์ฆ
โ€ข Clickjacking ์ทจ์•ฝ์ 
๐Ÿ› ๏ธ ์นจํˆฌ ํ…Œ์ŠคํŠธ ์‹ค์ „ ์˜ˆ์‹œ: SQL Injection
# 1๋‹จ๊ณ„: ์ทจ์•ฝ์  ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
http://target.com/product?id=1'
โ†’ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ™•์ธ

# 2๋‹จ๊ณ„: Union-based SQL Injection
http://target.com/product?id=1' UNION SELECT NULL,NULL,NULL--
โ†’ ์ปฌ๋Ÿผ ๊ฐœ์ˆ˜ ํŒŒ์•…

# 3๋‹จ๊ณ„: ๋ฐ์ดํ„ฐ ์ถ”์ถœ
http://target.com/product?id=1' UNION SELECT username,password,email FROM users--

# 4๋‹จ๊ณ„: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด ์ˆ˜์ง‘
http://target.com/product?id=1' UNION SELECT table_name,NULL,NULL FROM information_schema.tables--

๋ฌผ๋ก  ์‹ค์ œ๋กœ๋Š” ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์•„! WAF(Web Application Firewall)๋ฅผ ์šฐํšŒํ•˜๊ฑฐ๋‚˜, ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋ธ”๋ผ์ธ๋“œ SQL Injection ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์–ด. ๐ŸŽ“

๐Ÿ“Š 5๋‹จ๊ณ„: ๋ณด๊ณ ์„œ ์ž‘์„ฑ

๋ฐœ๊ฒฌํ•œ ์ทจ์•ฝ์ ์„ ์ •๋ฆฌํ•ด์„œ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋‹จ๊ณ„์•ผ. ์ด๊ฒŒ ์ƒ๊ฐ๋ณด๋‹ค ์ค‘์š”ํ•ด! ์•„๋ฌด๋ฆฌ ๋งŽ์€ ์ทจ์•ฝ์ ์„ ์ฐพ์•„๋„ ์ œ๋Œ€๋กœ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•˜๋ฉด ์†Œ์šฉ์—†๊ฑฐ๋“ . ๐Ÿ“

๐Ÿ“‹ ๋ณด๊ณ ์„œ ๊ตฌ์„ฑ ์š”์†Œ
1. ์š”์•ฝ (Executive Summary)
โ€ข ์ „์ฒด ๋ณด์•ˆ ์ˆ˜์ค€ ํ‰๊ฐ€
โ€ข ์ฃผ์š” ๋ฐœ๊ฒฌ ์‚ฌํ•ญ
โ€ข ์œ„ํ—˜๋„ ํ†ต๊ณ„
โ€ข ๊ถŒ์žฅ ์‚ฌํ•ญ ์š”์•ฝ
โ†’ ๊ฒฝ์˜์ง„์ด ์ฝ์„ ๋ถ€๋ถ„์ด๋‹ˆ ๊ธฐ์ˆ  ์šฉ์–ด๋Š” ์ตœ์†Œํ™”!
2. ์ ๊ฒ€ ๊ฐœ์š”
โ€ข ์ ๊ฒ€ ๋ฒ”์œ„ ๋ฐ ๊ธฐ๊ฐ„
โ€ข ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•๋ก  ๋ฐ ๋„๊ตฌ
โ€ข ์ œ์™ธ ์‚ฌํ•ญ
โ€ข ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ
3. ์ทจ์•ฝ์  ์ƒ์„ธ ๋‚ด์—ญ
๊ฐ ์ทจ์•ฝ์ ๋งˆ๋‹ค ๋‹ค์Œ ์ •๋ณด ํฌํ•จ:
โ€ข ์ œ๋ชฉ: ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์œผ๋กœ
โ€ข ์œ„ํ—˜๋„: Critical / High / Medium / Low
โ€ข ์„ค๋ช…: ์ทจ์•ฝ์ ์ด ๋ฌด์—‡์ธ์ง€
โ€ข ์˜ํ–ฅ: ์•…์šฉ ์‹œ ์–ด๋–ค ํ”ผํ•ด๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€
โ€ข ์žฌํ˜„ ๋ฐฉ๋ฒ•: ๋‹จ๊ณ„๋ณ„ ์ƒ์„ธ ์„ค๋ช…
โ€ข ์ฆ๊ฑฐ: ์Šคํฌ๋ฆฐ์ƒท, ๋กœ๊ทธ, ์ฝ”๋“œ ์กฐ๊ฐ
โ€ข ํ•ด๊ฒฐ ๋ฐฉ์•ˆ: ๊ตฌ์ฒด์ ์ธ ์ˆ˜์ • ๋ฐฉ๋ฒ•
โ€ข ์ฐธ๊ณ  ์ž๋ฃŒ: CVE, CWE, OWASP ๋งํฌ ๋“ฑ
4. ๊ฐœ์„  ๊ถŒ์žฅ ์‚ฌํ•ญ
โ€ข ์šฐ์„ ์ˆœ์œ„๋ณ„ ์กฐ์น˜ ๊ณ„ํš
โ€ข ์žฅ๊ธฐ์ ์ธ ๋ณด์•ˆ ๊ฐœ์„  ๋ฐฉํ–ฅ
โ€ข ๋ณด์•ˆ ๊ต์œก ํ•„์š”์„ฑ
โ€ข ์ •๊ธฐ ์ ๊ฒ€ ๊ณ„ํš
โš ๏ธ ๋ณด๊ณ ์„œ ์ž‘์„ฑ ์‹œ ์ฃผ์˜์‚ฌํ•ญ โ€ข ๋ฏผ๊ฐํ•œ ์ •๋ณด(์‹ค์ œ ๋น„๋ฐ€๋ฒˆํ˜ธ, ๊ฐœ์ธ์ •๋ณด ๋“ฑ)๋Š” ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ
โ€ข ์žฌํ˜„ ๋ฐฉ๋ฒ•์€ ์ƒ์„ธํ•˜๋˜, ์•…์šฉ ๊ฐ€๋Šฅํ•œ ์™„์ „ํ•œ ์ต์Šคํ”Œ๋กœ์ž‡ ์ฝ”๋“œ๋Š” ์ œ์™ธ
โ€ข ๊ฐ๊ด€์ ์ด๊ณ  ์‚ฌ์‹ค์— ๊ทผ๊ฑฐํ•œ ๋‚ด์šฉ๋งŒ ์ž‘์„ฑ
โ€ข ๋…์ž์˜ ๊ธฐ์ˆ  ์ˆ˜์ค€์— ๋งž์ถฐ ์„ค๋ช… (๊ฒฝ์˜์ง„์šฉ vs ๊ฐœ๋ฐœ์ž์šฉ)

๐Ÿ”ง 6๋‹จ๊ณ„: ๊ฐœ์„  ์กฐ์น˜ ๋ฐ ์žฌ๊ฒ€์ฆ

์ทจ์•ฝ์ ์„ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ์ œ๋Œ€๋กœ ์ˆ˜์ •ํ•˜๋Š” ๊ฒŒ ๋” ์ค‘์š”ํ•ด! ์ˆ˜์ • ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ ์žฌ๊ฒ€์ฆ์„ ํ•ด์•ผ ํ•ด. ๐Ÿ”„

๐ŸŽฏ ๊ฐœ์„  ์กฐ์น˜ ํ”„๋กœ์„ธ์Šค 1. ์šฐ์„ ์ˆœ์œ„ ๊ฒฐ์ •
โ€ข Critical: ์ฆ‰์‹œ ์กฐ์น˜ (24์‹œ๊ฐ„ ์ด๋‚ด)
โ€ข High: 1์ฃผ์ผ ์ด๋‚ด
โ€ข Medium: 1๊ฐœ์›” ์ด๋‚ด
โ€ข Low: ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค ์‹œ

2. ์ˆ˜์ • ๋ฐฉ๋ฒ• ๊ฒ€ํ† 
โ€ข ๊ฐœ๋ฐœํŒ€๊ณผ ํ˜‘์˜
โ€ข ์—ฌ๋Ÿฌ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ๋น„๊ต
โ€ข ๋ถ€์ž‘์šฉ ๊ฒ€ํ† 
โ€ข ํ…Œ์ŠคํŠธ ๊ณ„ํš ์ˆ˜๋ฆฝ

3. ์ˆ˜์ • ๊ตฌํ˜„
โ€ข ์ฝ”๋“œ ์ˆ˜์ •
โ€ข ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
โ€ข ์ฝ”๋“œ ๋ฆฌ๋ทฐ
โ€ข ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ

4. ์žฌ๊ฒ€์ฆ
โ€ข ์ทจ์•ฝ์ ์ด ์‹ค์ œ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
โ€ข ์ƒˆ๋กœ์šด ์ทจ์•ฝ์ ์ด ์ƒ๊ธฐ์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ
โ€ข ๊ธฐ๋Šฅ์ด ์ •์ƒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธ

๐Ÿ”จ ์‹ค์ „ ๋ณด์•ˆ ์ ๊ฒ€ ๋„๊ตฌ ํ™œ์šฉ๋ฒ•

์ด๋ก ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ค„ ์•Œ์•„์•ผ ํ•ด! ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ณด์•ˆ ์ ๊ฒ€ ๋„๊ตฌ๋“ค์„ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž. ๐Ÿ› ๏ธ

๐Ÿ•ท๏ธ OWASP ZAP (Zed Attack Proxy)

๋ฌด๋ฃŒ ์˜คํ”ˆ์†Œ์Šค ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ์Šค์บ๋„ˆ์•ผ. ์ดˆ๋ณด์ž๋„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด! ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ถ”์ฒœํ•˜๋Š” ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์•ผ. ๐Ÿ˜Š

๐ŸŽฏ OWASP ZAP ์ฃผ์š” ๊ธฐ๋Šฅ
1. Automated Scanner
์ž๋™์œผ๋กœ ์›น์‚ฌ์ดํŠธ๋ฅผ ํฌ๋กค๋งํ•˜๊ณ  ์ทจ์•ฝ์ ์„ ์Šค์บ”ํ•ด์ค˜.
# ZAP CLI ์‚ฌ์šฉ ์˜ˆ์‹œ
zap-cli quick-scan --self-contained \
--start-options '-config api.disablekey=true' \
http://target.com
2. Manual Explore
ํ”„๋ก์‹œ ๋ชจ๋“œ๋กœ ๋ธŒ๋ผ์šฐ์ € ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑ„์„œ ์ˆ˜๋™์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฒŒ ์ง„์งœ ๊ฐ•๋ ฅํ•ด!
3. Active Scan
์‹ค์ œ๋กœ ๊ณต๊ฒฉ์„ ์‹œ๋„ํ•ด์„œ ์ทจ์•ฝ์ ์„ ํ™•์ธํ•ด. SQL Injection, XSS ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณต๊ฒฉ์„ ์ž๋™์œผ๋กœ ์‹œ๋„ํ•ด์ค˜.
4. Fuzzer
ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋‹ค์–‘ํ•œ ๊ฐ’์„ ๋„ฃ์–ด๋ณด๋ฉด์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ์ฐพ์•„๋‚ด.
5. Spider
์›น์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  ํŽ˜์ด์ง€์™€ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์•„์ค˜.
๐Ÿ’ก ZAP ์‚ฌ์šฉ ํŒ โ€ข Firefox๋‚˜ Chrome์— ZAP ์ธ์ฆ์„œ๋ฅผ ์„ค์น˜ํ•ด์„œ HTTPS ํŠธ๋ž˜ํ”ฝ๋„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด
โ€ข Context๋ฅผ ์„ค์ •ํ•ด์„œ ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋„ ์Šค์บ” ๊ฐ€๋Šฅ
โ€ข API ์Šค์บ”๋„ ์ง€์›ํ•ด (OpenAPI/Swagger ํŒŒ์ผ import)
โ€ข CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉ ๊ฐ€๋Šฅ

๐Ÿ”ฅ Burp Suite

ํ”„๋กœ ํ•ด์ปค๋“ค์ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ์•ผ. ์œ ๋ฃŒ ๋ฒ„์ „(Pro)๊ณผ ๋ฌด๋ฃŒ ๋ฒ„์ „(Community)์ด ์žˆ๋Š”๋ฐ, ๋ฌด๋ฃŒ ๋ฒ„์ „๋„ ์ถฉ๋ถ„ํžˆ ๊ฐ•๋ ฅํ•ด! ๐ŸŽฏ

๐ŸŽฏ Burp Suite ํ•ต์‹ฌ ๊ธฐ๋Šฅ
1. Proxy
๋ชจ๋“  HTTP/HTTPS ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑ„์„œ ์ˆ˜์ •ํ•˜๊ณ  ์žฌ์ „์†กํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฒŒ Burp์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด์ง€!
2. Repeater
ํŠน์ • ์š”์ฒญ์„ ๋ฐ˜๋ณตํ•ด์„œ ๋ณด๋‚ด๋ฉด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด. SQL Injection์ด๋‚˜ XSS ํ…Œ์ŠคํŠธํ•  ๋•Œ ์ •๋ง ์œ ์šฉํ•ด!
3. Intruder
์ž๋™ํ™”๋œ ๊ณต๊ฒฉ ๋„๊ตฌ์•ผ. ๋‹ค์–‘ํ•œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์‹œ๋„ํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด. (Pro ๋ฒ„์ „์—์„œ๋Š” ์†๋„ ์ œํ•œ ์—†์Œ)
4. Scanner (Pro only)
์ž๋™ ์ทจ์•ฝ์  ์Šค์บ๋„ˆ. ์ •ํ™•๋„๊ฐ€ ๋†’์•„์„œ False Positive๊ฐ€ ์ ์–ด.
5. Decoder
Base64, URL ์ธ์ฝ”๋”ฉ, HTML ์—”ํ‹ฐํ‹ฐ ๋“ฑ ๋‹ค์–‘ํ•œ ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ ์ง€์›.
6. Comparer
๋‘ ๊ฐœ์˜ ์š”์ฒญ/์‘๋‹ต์„ ๋น„๊ตํ•ด์„œ ์ฐจ์ด์ ์„ ์ฐพ์•„์ค˜. ๋ธ”๋ผ์ธ๋“œ SQL Injection ์ฐพ์„ ๋•Œ ์œ ์šฉํ•ด!
๐ŸŽ“ Burp Suite ์‹ค์ „ ํ™œ์šฉ ์˜ˆ์‹œ ์‹œ๋‚˜๋ฆฌ์˜ค: SQL Injection ํ…Œ์ŠคํŠธ

1. Proxy์—์„œ ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ”
2. ์šฐํด๋ฆญ โ†’ "Send to Repeater"
3. Repeater์—์„œ username ํŒŒ๋ผ๋ฏธํ„ฐ์— ' OR '1'='1 ์ž…๋ ฅ
4. "Send" ํด๋ฆญํ•ด์„œ ์‘๋‹ต ํ™•์ธ
5. ์ทจ์•ฝ์  ๋ฐœ๊ฒฌ ์‹œ "Send to Intruder"๋กœ ๋” ๋งŽ์€ ํŽ˜์ด๋กœ๋“œ ํ…Œ์ŠคํŠธ
6. ๊ฒฐ๊ณผ๋ฅผ ์ •๋ฆฌํ•ด์„œ ๋ณด๊ณ ์„œ์— ํฌํ•จ

๐Ÿ” Nmap

๋„คํŠธ์›Œํฌ ์Šค์บ๋‹์˜ ์ „์„ค์ ์ธ ๋„๊ตฌ์•ผ! ํฌํŠธ ์Šค์บ”, ์„œ๋น„์Šค ํƒ์ง€, OS ํƒ์ง€ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด. ๐ŸŒ

๐ŸŽฏ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” Nmap ๋ช…๋ น์–ด
# ๊ธฐ๋ณธ ํฌํŠธ ์Šค์บ”
nmap target.com

# ์„œ๋น„์Šค ๋ฒ„์ „ ํƒ์ง€
nmap -sV target.com

# OS ํƒ์ง€
nmap -O target.com

# ์Šคํฌ๋ฆฝํŠธ ์Šค์บ” (์ทจ์•ฝ์  ํƒ์ง€)
nmap --script vuln target.com

# ์ „์ฒด ํฌํŠธ ์Šค์บ”
nmap -p- target.com

# ๋น ๋ฅธ ์Šค์บ” (์ƒ์œ„ 100๊ฐœ ํฌํŠธ)
nmap -F target.com

# ์Šคํ…”์Šค ์Šค์บ” (SYN ์Šค์บ”)
nmap -sS target.com

# UDP ์Šค์บ”
nmap -sU target.com
โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ Nmap์€ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ง€๋งŒ, ํ—ˆ๊ฐ€ ์—†์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์‹œ์Šคํ…œ์„ ์Šค์บ”ํ•˜๋ฉด ๋ถˆ๋ฒ•์ด์•ผ! ๋ฐ˜๋“œ์‹œ ์Šน์ธ๋ฐ›์€ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ด. ๐Ÿšจ

๐Ÿ Sqlmap

SQL Injection ๊ณต๊ฒฉ์„ ์ž๋™ํ™”ํ•ด์ฃผ๋Š” ๋„๊ตฌ์•ผ. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ข…๋ฅ˜๋ฅผ ์ž๋™์œผ๋กœ ํƒ์ง€ํ•˜๊ณ , ์ตœ์ ์˜ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์ค˜! ๐ŸŽฏ

๐ŸŽฏ Sqlmap ์‚ฌ์šฉ ์˜ˆ์‹œ
# ๊ธฐ๋ณธ SQL Injection ํ…Œ์ŠคํŠธ
sqlmap -u "http://target.com/page?id=1"

# POST ๋ฐ์ดํ„ฐ ํ…Œ์ŠคํŠธ
sqlmap -u "http://target.com/login" --data="username=admin&password=test"

# ์ฟ ํ‚ค ์‚ฌ์šฉ
sqlmap -u "http://target.com/page?id=1" --cookie="PHPSESSID=abc123"

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ
sqlmap -u "http://target.com/page?id=1" --dbs

# ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๋ชฉ๋ก
sqlmap -u "http://target.com/page?id=1" -D database_name --tables

# ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ๋คํ”„
sqlmap -u "http://target.com/page?id=1" -D database_name -T users --dump

# OS ์‰˜ ํš๋“ ์‹œ๋„
sqlmap -u "http://target.com/page?id=1" --os-shell
๐Ÿ’ก Pro Tip: Sqlmap์€ ๋งค์šฐ ๊ณต๊ฒฉ์ ์ธ ๋„๊ตฌ์•ผ. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” --risk์™€ --level ์˜ต์…˜์„ ์กฐ์ ˆํ•ด์„œ ์•ˆ์ „ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ด!

๐Ÿ—๏ธ ๋ณด์•ˆ ์ฝ”๋”ฉ ์‹ค๋ฌด ๊ฐ€์ด๋“œ

์ทจ์•ฝ์ ์„ ์ฐพ๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ์• ์ดˆ์— ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ๋” ์ค‘์š”ํ•˜์ง€! ์‹ค๋ฌด์—์„œ ๋ฐ”๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด์•ˆ ์ฝ”๋”ฉ ๊ฐ€์ด๋“œ๋ฅผ ์•Œ๋ ค์ค„๊ฒŒ. ๐Ÿ’ป

๐Ÿ›ก๏ธ ์ž…๋ ฅ ๊ฒ€์ฆ (Input Validation)

"๋ชจ๋“  ์ž…๋ ฅ์€ ์•…์˜์ ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ผ" - ์ด๊ฒŒ ๋ณด์•ˆ ์ฝ”๋”ฉ์˜ ์ฒซ ๋ฒˆ์งธ ์›์น™์ด์•ผ! ์‚ฌ์šฉ์ž ์ž…๋ ฅ, API ํŒŒ๋ผ๋ฏธํ„ฐ, ํŒŒ์ผ ์—…๋กœ๋“œ ๋“ฑ ๋ชจ๋“  ์™ธ๋ถ€ ์ž…๋ ฅ์„ ์ฒ ์ €ํžˆ ๊ฒ€์ฆํ•ด์•ผ ํ•ด. โœ…

๐ŸŽฏ ์ž…๋ ฅ ๊ฒ€์ฆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
1. ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹ ์‚ฌ์šฉ
ํ—ˆ์šฉํ•  ๊ฐ’์„ ๋ช…์‹œํ•˜๋Š” ๊ฒŒ ์ฐจ๋‹จํ•  ๊ฐ’์„ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์•ˆ์ „ํ•ด!
// ๋‚˜์œ ์˜ˆ โŒ (๋ธ”๋ž™๋ฆฌ์ŠคํŠธ)
if (input.contains("script") || input.contains("alert")) {
throw new ValidationException();
}

// ์ข‹์€ ์˜ˆ โœ… (ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ)
if (!input.matches("^[a-zA-Z0-9_]{3,20}$")) {
throw new ValidationException("์‚ฌ์šฉ์ž๋ช…์€ ์˜๋ฌธ, ์ˆซ์ž, ์–ธ๋”์Šค์ฝ”์–ด๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค");
}
2. ๋ฐ์ดํ„ฐ ํƒ€์ž… ๊ฒ€์ฆ
// Spring Boot ์˜ˆ์‹œ
@PostMapping("/user")
public ResponseEntity createUser(@Valid @RequestBody UserDto user) {
// @Valid ์–ด๋…ธํ…Œ์ด์…˜์ด ์ž๋™์œผ๋กœ ๊ฒ€์ฆ
}

public class UserDto {
@NotBlank(message = "์ด๋ฆ„์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค")
@Size(min = 2, max = 50)
private String name;

@Email(message = "์˜ฌ๋ฐ”๋ฅธ ์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค")
private String email;

@Min(18)
@Max(120)
private int age;
}
3. ๊ธธ์ด ์ œํ•œ
DoS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅ ๊ธธ์ด๋ฅผ ์ œํ•œํ•ด์•ผ ํ•ด.
// ํŒŒ์ผ ์—…๋กœ๋“œ ํฌ๊ธฐ ์ œํ•œ
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
4. ํŠน์ˆ˜ ๋ฌธ์ž ์ฒ˜๋ฆฌ
// HTML ์ด์Šค์ผ€์ดํ”„
String safe = StringEscapeUtils.escapeHtml4(userInput);

// SQL ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ
PreparedStatement pstmt = conn.prepareStatement(
"SELECT * FROM users WHERE username = ?");
pstmt.setString(1, username);

๐Ÿ” ์ธ์ฆ ๋ฐ ์„ธ์…˜ ๊ด€๋ฆฌ

์•ˆ์ „ํ•œ ์ธ์ฆ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฑด ์ •๋ง ์ค‘์š”ํ•ด! ์‹ค๋ฌด์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด๋“ค์„ ์•Œ์•„๋ณด์ž. ๐Ÿ”‘

๐ŸŽฏ ์•ˆ์ „ํ•œ ์ธ์ฆ ๊ตฌํ˜„
1. ๋น„๋ฐ€๋ฒˆํ˜ธ ์ •์ฑ…
public class PasswordValidator {
private static final int MIN_LENGTH = 8;
private static final String PASSWORD_PATTERN =
"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$";

public static boolean isValid(String password) {
if (password == null || password.length() < MIN_LENGTH) {
return false;
}
return password.matches(PASSWORD_PATTERN);
}

// ์ผ๋ฐ˜์ ์ธ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฒดํฌ
private static final Set<String> COMMON_PASSWORDS = Set.of(
"password", "123456", "qwerty", "admin"
);

public static boolean isCommon(String password) {
return COMMON_PASSWORDS.contains(password.toLowerCase());
}
}
2. ๋กœ๊ทธ์ธ ์‹œ๋„ ์ œํ•œ
@Service
public class LoginAttemptService {
private final int MAX_ATTEMPT = 5;
private LoadingCache<String, Integer> attemptsCache;

public LoginAttemptService() {
attemptsCache = CacheBuilder.newBuilder()
.expireAfterWrite(1, TimeUnit.DAYS)
.build(new CacheLoader<String, Integer>() {
public Integer load(String key) {
return 0;
}
});
}

public void loginFailed(String key) {
int attempts = attemptsCache.getUnchecked(key);
attempts++;
attemptsCache.put(key, attempts);
}

public boolean isBlocked(String key) {
return attemptsCache.getUnchecked(key) >= MAX_ATTEMPT;
}
}
3. ์„ธ์…˜ ๋ณด์•ˆ ์„ค์ •
// Spring Security ์„ค์ •
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.maximumSessions(1) // ๋™์‹œ ์„ธ์…˜ ์ œํ•œ
.maxSessionsPreventsLogin(true)
.and()
.sessionFixation().newSession() // ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ ๋ฐฉ์–ด
.invalidSessionUrl("/login")
.and()
.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());

return http.build();
}
}
4. JWT ํ† ํฐ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ
public class JwtUtil {
// ๋น„๋ฐ€ํ‚ค๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋‚˜ ์„ค์ • ํŒŒ์ผ์—์„œ ์ฝ์–ด์˜ค๊ธฐ
private String SECRET_KEY = System.getenv("JWT_SECRET");

// ์งง์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ • (15๋ถ„)
private long EXPIRATION_TIME = 900000;

public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}

// Refresh Token ๋ณ„๋„ ๊ด€๋ฆฌ
public String generateRefreshToken(String username) {
return Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + 604800000)) // 7์ผ
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
}

๐Ÿ”’ ์•”ํ˜ธํ™” ๋ฐ ํ•ด์‹ฑ

๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž! ์•”ํ˜ธํ™”์™€ ํ•ด์‹ฑ์€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ๋„ ๊ธฐ์–ตํ•ด์•ผ ํ•ด. ๐Ÿ”

๐Ÿ“š ์•”ํ˜ธํ™” vs ํ•ด์‹ฑ ์•”ํ˜ธํ™” (Encryption):
โ€ข ์–‘๋ฐฉํ–ฅ: ์•”ํ˜ธํ™” โ†” ๋ณตํ˜ธํ™” ๊ฐ€๋Šฅ
โ€ข ํ‚ค๊ฐ€ ํ•„์š”
โ€ข ์‚ฌ์šฉ ์˜ˆ: ํŒŒ์ผ ์•”ํ˜ธํ™”, ํ†ต์‹  ์•”ํ˜ธํ™”
โ€ข ์•Œ๊ณ ๋ฆฌ์ฆ˜: AES, RSA

ํ•ด์‹ฑ (Hashing):
โ€ข ๋‹จ๋ฐฉํ–ฅ: ํ•ด์‹œ โ†’ ์›๋ณธ ๋ณต๊ตฌ ๋ถˆ๊ฐ€
โ€ข ํ‚ค ๋ถˆํ•„์š” (Salt ์‚ฌ์šฉ)
โ€ข ์‚ฌ์šฉ ์˜ˆ: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ, ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ
โ€ข ์•Œ๊ณ ๋ฆฌ์ฆ˜: bcrypt, Argon2, PBKDF2
๐ŸŽฏ ์‹ค์ „ ์•”ํ˜ธํ™” ๊ตฌํ˜„
1. ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹ฑ (bcrypt)
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Service
public class PasswordService {
private BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(12); // strength

public String hashPassword(String plainPassword) {
return encoder.encode(plainPassword);
}

public boolean verifyPassword(String plainPassword, String hashedPassword) {
return encoder.matches(plainPassword, hashedPassword);
}
}
2. ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” (AES)
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESEncryption {
private static final String ALGORITHM = "AES";
private static final String KEY = System.getenv("ENCRYPTION_KEY"); // 32๋ฐ”์ดํŠธ

public static String encrypt(String data) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encrypted = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}

public static String decrypt(String encryptedData) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(decrypted);
}
}
3. HTTPS ํ†ต์‹  ๊ฐ•์ œ
// Spring Boot์—์„œ HTTPS ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
@Configuration
public class HttpsConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
http.requiresChannel()
.anyRequest()
.requiresSecure();
return http.build();
}
}

// HSTS ํ—ค๋” ์ถ”๊ฐ€
http.headers()
.httpStrictTransportSecurity()
.includeSubDomains(true)
.maxAgeInSeconds(31536000);

๐Ÿ›ก๏ธ API ๋ณด์•ˆ

์š”์ฆ˜์€ RESTful API๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ž–์•„? API ๋ณด์•ˆ๋„ ์ •๋ง ์ค‘์š”ํ•ด! ํŠนํžˆ ๋ชจ๋ฐ”์ผ ์•ฑ์ด๋‚˜ SPA(Single Page Application)์—์„œ API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋”์šฑ ์‹ ๊ฒฝ ์จ์•ผ ํ•ด. ๐Ÿ“ฑ

๐ŸŽฏ API ๋ณด์•ˆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
1. API ์ธ์ฆ (OAuth 2.0)
// Spring Security OAuth2 ์„ค์ •
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/public/**").permitAll()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated();
}
}
2. Rate Limiting (์†๋„ ์ œํ•œ)
// Bucket4j๋ฅผ ์‚ฌ์šฉํ•œ Rate Limiting
@Component
public class RateLimitInterceptor implements HandlerInterceptor {
private final Map<String, Bucket> cache = new ConcurrentHashMap<>();

@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
String key = request.getRemoteAddr();
Bucket bucket = cache.computeIfAbsent(key, k -> createBucket());

if (bucket.tryConsume(1)) {
return true;
}

response.setStatus(429); // Too Many Requests
return false;
}

private Bucket createBucket() {
// ๋ถ„๋‹น 100๊ฐœ ์š”์ฒญ ํ—ˆ์šฉ
Bandwidth limit = Bandwidth.classic(100, Refill.intervally(100, Duration.ofMinutes(1)));
return Bucket.builder().addLimit(limit).build();
}
}
3. CORS ์„ค์ •
@Configuration
public class CorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("https://trusted-domain.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
};
}
}
4. API ๋ฒ„์ „ ๊ด€๋ฆฌ
// URL ๋ฒ„์ „ ๊ด€๋ฆฌ
@RestController
@RequestMapping("/api/v1/users")
public class UserControllerV1 {
// v1 API
}

@RestController
@RequestMapping("/api/v2/users")
public class UserControllerV2 {
// v2 API (๋ณด์•ˆ ๊ฐ•ํ™” ๋ฒ„์ „)
}
5. API ์‘๋‹ต์—์„œ ๋ฏผ๊ฐํ•œ ์ •๋ณด ์ œ๊ฑฐ
public class UserDto {
private Long id;
private String username;
private String email;

@JsonIgnore // JSON ์‘๋‹ต์—์„œ ์ œ์™ธ
private String password;

@JsonIgnore
private String ssn; // ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ
}

๐ŸŽ“ ๋ณด์•ˆ ๊ต์œก๊ณผ ๋ฌธํ™” ๋งŒ๋“ค๊ธฐ

์•„๋ฌด๋ฆฌ ์ข‹์€ ๋ณด์•ˆ ๋„๊ตฌ์™€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์–ด๋„, ํŒ€์›๋“ค์ด ๋ณด์•ˆ์˜ ์ค‘์š”์„ฑ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ์†Œ์šฉ์—†์–ด. ์กฐ์ง ๋‚ด์— ๋ณด์•ˆ ๋ฌธํ™”๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ์ •๋ง ์ค‘์š”ํ•ด! ๐Ÿ‘ฅ

๐ŸŽฏ ํšจ๊ณผ์ ์ธ ๋ณด์•ˆ ๊ต์œก ๋ฐฉ๋ฒ•
1. ์ •๊ธฐ์ ์ธ ๋ณด์•ˆ ๊ต์œก
โ€ข ๋ถ„๊ธฐ๋ณ„ ๋ณด์•ˆ ์›Œํฌ์ƒต ๊ฐœ์ตœ
โ€ข ์ตœ์‹  ๋ณด์•ˆ ํŠธ๋ Œ๋“œ ๊ณต์œ 
โ€ข ์‹ค์ œ ์‚ฌ๋ก€ ๊ธฐ๋ฐ˜ ํ•™์Šต
โ€ข ํ•ดํ‚น ์‹œ์—ฐ ๋ฐ ๋ฐฉ์–ด ์‹ค์Šต
2. CTF (Capture The Flag) ๋Œ€ํšŒ
๊ฒŒ์ž„์ฒ˜๋Ÿผ ์žฌ๋ฏธ์žˆ๊ฒŒ ๋ณด์•ˆ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด! ํŒ€ ๋‚ด์—์„œ CTF ๋Œ€ํšŒ๋ฅผ ์—ด์–ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์•„.

์ถ”์ฒœ ํ”Œ๋žซํผ:
โ€ข HackTheBox
โ€ข TryHackMe
โ€ข PicoCTF
โ€ข OWASP WebGoat
3. ์ฝ”๋“œ ๋ฆฌ๋ทฐ์— ๋ณด์•ˆ ์ฒดํฌ ํฌํ•จ
โ€ข ๋ณด์•ˆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์ž‘์„ฑ
โ€ข ์ทจ์•ฝํ•œ ์ฝ”๋“œ ํŒจํ„ด ๊ณต์œ 
โ€ข ์•ˆ์ „ํ•œ ๋Œ€์•ˆ ์ œ์‹œ
โ€ข ์ž๋™ํ™” ๋„๊ตฌ ํ™œ์šฉ (SonarQube ๋“ฑ)
4. ๋ณด์•ˆ ์ฑ”ํ”ผ์–ธ ์ œ๋„
๊ฐ ํŒ€์— ๋ณด์•ˆ ์ฑ”ํ”ผ์–ธ์„ ๋‘์–ด์„œ ๋ณด์•ˆ ์ง€์‹์„ ์ „ํŒŒํ•˜๊ณ , ๋ณด์•ˆ ์ด์Šˆ๋ฅผ ๋จผ์ € ๋ฐœ๊ฒฌํ•˜๋„๋ก ํ•ด.
๐Ÿ’ก ์žฌ๋Šฅ๋„ท์—์„œ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€ ์ฐพ๊ธฐ ๋ณด์•ˆ์€ ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ„์•ผ์•ผ. ์žฌ๋Šฅ๋„ท์—์„œ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€์˜ ๋ฉ˜ํ† ๋ง์„ ๋ฐ›๊ฑฐ๋‚˜, ๋ณด์•ˆ ๊ต์œก ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ! ์‹ค๋ฌด ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ์ „๋ฌธ๊ฐ€๋“ค์ด ๋งŽ์ด ํ™œ๋™ํ•˜๊ณ  ์žˆ์–ด์„œ, ์‹ค์ „ ๋…ธํ•˜์šฐ๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด. ๐ŸŽ“

๐Ÿ“Š ๋ณด์•ˆ ์ ๊ฒ€ ์ž๋™ํ™” ๋ฐ CI/CD ํ†ตํ•ฉ

๋งค๋ฒˆ ์ˆ˜๋™์œผ๋กœ ๋ณด์•ˆ ์ ๊ฒ€์„ ํ•˜๋Š” ๊ฑด ๋น„ํšจ์œจ์ ์ด์•ผ. CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ๋ณด์•ˆ ์ ๊ฒ€์„ ํ†ตํ•ฉํ•ด์„œ ์ž๋™ํ™”ํ•˜๋ฉด, ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์–ด! ์ด๊ฑธ DevSecOps๋ผ๊ณ  ํ•ด. ๐Ÿš€

๐ŸŽฏ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ๋ณด์•ˆ ํ†ตํ•ฉํ•˜๊ธฐ
1. ์ •์  ๋ถ„์„ (SAST) ํ†ตํ•ฉ
# GitLab CI ์˜ˆ์‹œ
stages:
- build
- test
- security
- deploy

sast:
stage: security
image: returntocorp/semgrep
script:
- semgrep --config=auto --json --output=semgrep-report.json .
artifacts:
reports:
sast: semgrep-report.json
allow_failure: false # ์ทจ์•ฝ์  ๋ฐœ๊ฒฌ ์‹œ ๋นŒ๋“œ ์‹คํŒจ
2. ์˜์กด์„ฑ ๊ฒ€์‚ฌ
# GitHub Actions ์˜ˆ์‹œ
name: Security Scan

on: [push, pull_request]

jobs:
dependency-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2

- name: Run Snyk
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: --severity-threshold=high
3. ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์Šค์บ”
# Docker ์ด๋ฏธ์ง€ ๋ณด์•ˆ ์Šค์บ”
docker-scan:
stage: security
script:
- docker build -t myapp:$CI_COMMIT_SHA .
- trivy image --severity HIGH,CRITICAL myapp:$CI_COMMIT_SHA
only:
- main
- develop
4. ๋™์  ๋ถ„์„ (DAST) ํ†ตํ•ฉ
# OWASP ZAP ์Šค์บ”
dast:
stage: security
image: owasp/zap2docker-stable
script:
- zap-baseline.py -t https://staging.example.com -r zap-report.html
artifacts:
paths:
- zap-report.html
only:
- staging
โœ… DevSecOps ๋ชจ๋ฒ” ์‚ฌ๋ก€ โ€ข Shift Left: ๊ฐœ๋ฐœ ์ดˆ๊ธฐ ๋‹จ๊ณ„๋ถ€ํ„ฐ ๋ณด์•ˆ ๊ณ ๋ ค
โ€ข ์ž๋™ํ™”: ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ณด์•ˆ ๊ฒ€์‚ฌ ์ž๋™ํ™”
โ€ข ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ: ์ทจ์•ฝ์  ๋ฐœ๊ฒฌ ์ฆ‰์‹œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์•Œ๋ฆผ
โ€ข ์ง€์†์  ๊ฐœ์„ : ๋ณด์•ˆ ์ •์ฑ…๊ณผ ๋„๊ตฌ ์ง€์†์  ์—…๋ฐ์ดํŠธ
โ€ข ํ˜‘์—…: ๊ฐœ๋ฐœ, ๋ณด์•ˆ, ์šด์˜ ํŒ€ ๊ฐ„ ๊ธด๋ฐ€ํ•œ ํ˜‘๋ ฅ

๐ŸŒ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ ๋ณด์•ˆ

์š”์ฆ˜์€ AWS, Azure, GCP ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ž–์•„? ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ์˜ ๋ณด์•ˆ๋„ ์•Œ์•„์•ผ ํ•ด! โ˜๏ธ

๐ŸŽฏ ํด๋ผ์šฐ๋“œ ๋ณด์•ˆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
1. IAM (Identity and Access Management)
โ€ข ์ตœ์†Œ ๊ถŒํ•œ ์›์น™ ์ ์šฉ
โ€ข MFA(๋‹ค์ค‘ ์ธ์ฆ) ํ•„์ˆ˜ ํ™œ์„ฑํ™”
โ€ข ๋ฃจํŠธ ๊ณ„์ • ์‚ฌ์šฉ ๊ธˆ์ง€
โ€ข ์ •๊ธฐ์ ์ธ ๊ถŒํ•œ ๊ฒ€ํ† 
โ€ข ์ž„์‹œ ์ž๊ฒฉ ์ฆ๋ช… ์‚ฌ์šฉ (STS)
2. ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ
โ€ข VPC(Virtual Private Cloud) ๊ตฌ์„ฑ
โ€ข ๋ณด์•ˆ ๊ทธ๋ฃน ๋ฐ NACL ์„ค์ •
โ€ข ํ”„๋ผ์ด๋น— ์„œ๋ธŒ๋„ท ํ™œ์šฉ
โ€ข VPN ๋˜๋Š” Direct Connect ์‚ฌ์šฉ
โ€ข DDoS ๋ฐฉ์–ด (AWS Shield, CloudFlare ๋“ฑ)
3. ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ
โ€ข ์ €์žฅ ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” (EBS, S3 ๋“ฑ)
โ€ข ์ „์†ก ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” (TLS/SSL)
โ€ข KMS(Key Management Service) ํ™œ์šฉ
โ€ข ์ •๊ธฐ์ ์ธ ๋ฐฑ์—…
โ€ข ๋ฒ„์ „ ๊ด€๋ฆฌ ํ™œ์„ฑํ™”
4. ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง
โ€ข CloudTrail ํ™œ์„ฑํ™” (AWS)
โ€ข CloudWatch ์•Œ๋žŒ ์„ค์ •
โ€ข ๋ณด์•ˆ ์ด๋ฒคํŠธ ์ค‘์•™ ์ง‘์ค‘ํ™”
โ€ข SIEM ๋„๊ตฌ ํ™œ์šฉ
โ€ข ์ •๊ธฐ์ ์ธ ๋กœ๊ทธ ๋ถ„์„
5. ์ปดํ”Œ๋ผ์ด์–ธ์Šค
โ€ข ๊ทœ์ • ์ค€์ˆ˜ ํ™•์ธ (GDPR, HIPAA ๋“ฑ)
โ€ข ์ •๊ธฐ์ ์ธ ๋ณด์•ˆ ๊ฐ์‚ฌ
โ€ข ์ทจ์•ฝ์  ์Šค์บ”
โ€ข ์นจํˆฌ ํ…Œ์ŠคํŠธ (ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž ์ •์ฑ… ํ™•์ธ)
๐Ÿ”ง AWS ๋ณด์•ˆ ๋„๊ตฌ ์˜ˆ์‹œ
# AWS CLI๋กœ ๋ณด์•ˆ ๊ทธ๋ฃน ๊ฐ์‚ฌ
aws ec2 describe-security-groups \
--filters Name=ip-permission.cidr,Values='0.0.0.0/0' \
--query 'SecurityGroups[*].[GroupName,GroupId]'

# S3 ๋ฒ„ํ‚ท ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ
aws s3api put-public-access-block \
--bucket my-bucket \
--public-access-block-configuration \
"BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"

# CloudTrail ํ™œ์„ฑํ™”
aws cloudtrail create-trail \
--name my-trail \
--s3-bucket-name my-trail-bucket

aws cloudtrail start-logging --name my-trail

๐Ÿšจ ๋ณด์•ˆ ์‚ฌ๊ณ  ๋Œ€์‘ (Incident Response)

์•„๋ฌด๋ฆฌ ๋ณด์•ˆ์„ ์ž˜ํ•ด๋„ 100% ์™„๋ฒฝํ•  ์ˆ˜๋Š” ์—†์–ด. ๋ณด์•ˆ ์‚ฌ๊ณ ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•˜๋А๋ƒ๊ฐ€ ์ •๋ง ์ค‘์š”ํ•ด! ๐Ÿ†˜

๐ŸŽฏ ๋ณด์•ˆ ์‚ฌ๊ณ  ๋Œ€์‘ ํ”„๋กœ์„ธ์Šค
1๋‹จ๊ณ„: ์ค€๋น„ (Preparation)
โ€ข ์‚ฌ๊ณ  ๋Œ€์‘ ํŒ€ ๊ตฌ์„ฑ
โ€ข ์—ฐ๋ฝ๋ง ๊ตฌ์ถ•
โ€ข ๋Œ€์‘ ์ ˆ์ฐจ ๋ฌธ์„œํ™”
โ€ข ์ •๊ธฐ์ ์ธ ํ›ˆ๋ จ
โ€ข ํ•„์š”ํ•œ ๋„๊ตฌ ์ค€๋น„
2๋‹จ๊ณ„: ํƒ์ง€ ๋ฐ ๋ถ„์„ (Detection & Analysis)
โ€ข ์ด์ƒ ์ง•ํ›„ ๋ชจ๋‹ˆํ„ฐ๋ง
โ€ข ๋ณด์•ˆ ์ด๋ฒคํŠธ ๋ถ„์„
โ€ข ์‚ฌ๊ณ  ์‹ฌ๊ฐ๋„ ํ‰๊ฐ€
โ€ข ์˜ํ–ฅ ๋ฒ”์œ„ ํŒŒ์•…
โ€ข ์ฆ๊ฑฐ ์ˆ˜์ง‘ ๋ฐ ๋ณด์กด
3๋‹จ๊ณ„: ๊ฒฉ๋ฆฌ (Containment)
โ€ข ๋‹จ๊ธฐ ๊ฒฉ๋ฆฌ: ์ฆ‰๊ฐ์ ์ธ ํ”ผํ•ด ์ฐจ๋‹จ
โ€ข ์žฅ๊ธฐ ๊ฒฉ๋ฆฌ: ์‹œ์Šคํ…œ ๋ณต๊ตฌ ์ค€๋น„
โ€ข ๋ฐฑ์—… ์‹œ์Šคํ…œ ํ™œ์„ฑํ™”
โ€ข ๋„คํŠธ์›Œํฌ ์„ธ๊ทธ๋จผํŠธ ๋ถ„๋ฆฌ
4๋‹จ๊ณ„: ์ œ๊ฑฐ (Eradication)
โ€ข ์•…์„ฑ ์ฝ”๋“œ ์ œ๊ฑฐ
โ€ข ์ทจ์•ฝ์  ํŒจ์น˜
โ€ข ์นจํ•ด๋œ ๊ณ„์ • ๋น„ํ™œ์„ฑํ™”
โ€ข ์‹œ์Šคํ…œ ์žฌ๊ตฌ์ถ•
5๋‹จ๊ณ„: ๋ณต๊ตฌ (Recovery)
โ€ข ์‹œ์Šคํ…œ ์ •์ƒํ™”
โ€ข ์„œ๋น„์Šค ์žฌ๊ฐœ
โ€ข ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐ•ํ™”
โ€ข ์žฌ๋ฐœ ๋ฐฉ์ง€ ์กฐ์น˜
6๋‹จ๊ณ„: ์‚ฌํ›„ ๋ถ„์„ (Lessons Learned)
โ€ข ์‚ฌ๊ณ  ์›์ธ ๋ถ„์„
โ€ข ๋Œ€์‘ ๊ณผ์ • ํ‰๊ฐ€
โ€ข ๊ฐœ์„  ์‚ฌํ•ญ ๋„์ถœ
โ€ข ๋ฌธ์„œํ™” ๋ฐ ๊ณต์œ 
โ€ข ์ •์ฑ… ๋ฐ ์ ˆ์ฐจ ์—…๋ฐ์ดํŠธ
โš ๏ธ ๋ณด์•ˆ ์‚ฌ๊ณ  ๋ฐœ์ƒ ์‹œ ์ฃผ์˜์‚ฌํ•ญ โ€ข ๋‹นํ™ฉํ•˜์ง€ ๋ง๊ธฐ: ์นจ์ฐฉํ•˜๊ฒŒ ์ ˆ์ฐจ์— ๋”ฐ๋ผ ๋Œ€์‘
โ€ข ์ฆ๊ฑฐ ๋ณด์กด: ๋กœ๊ทธ, ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„ ๋“ฑ ์‚ญ์ œํ•˜์ง€ ๋ง ๊ฒƒ
โ€ข ์†Œํ†ต: ๊ด€๋ จ ๋ถ€์„œ ๋ฐ ๊ฒฝ์˜์ง„์— ์ฆ‰์‹œ ๋ณด๊ณ 
โ€ข ๋ฒ•์  ๊ณ ๋ ค: ํ•„์š”์‹œ ๋ฒ• ์ง‘ํ–‰ ๊ธฐ๊ด€์— ์‹ ๊ณ 
โ€ข ๊ณ ๊ฐ ํ†ต์ง€: ๊ฐœ์ธ์ •๋ณด ์œ ์ถœ ์‹œ ๋ฒ•์  ์˜๋ฌด ์ค€์ˆ˜

๐Ÿ“š ๋ณด์•ˆ ํ•™์Šต ๋ฆฌ์†Œ์Šค ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ

๋ณด์•ˆ์€ ๊ณ„์† ๊ณต๋ถ€ํ•ด์•ผ ํ•˜๋Š” ๋ถ„์•ผ์•ผ. ์ƒˆ๋กœ์šด ์ทจ์•ฝ์ ๊ณผ ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ด ๊ณ„์† ๋‚˜์˜ค๊ฑฐ๋“ ! ์œ ์šฉํ•œ ํ•™์Šต ๋ฆฌ์†Œ์Šค๋“ค์„ ์†Œ๊ฐœํ• ๊ฒŒ. ๐Ÿ“–

๐ŸŽ“ ์ถ”์ฒœ ํ•™์Šต ํ”Œ๋žซํผ ์˜จ๋ผ์ธ ๊ฐ•์˜:
Coursera Udemy Pluralsight ์ธํ”„๋Ÿฐ ํŒจ์ŠคํŠธ์บ ํผ์Šค

์‹ค์Šต ํ”Œ๋žซํผ:
HackTheBox TryHackMe PortSwigger Web Security Academy OWASP WebGoat PentesterLab

์ž๊ฒฉ์ฆ:
CEH (Certified Ethical Hacker) OSCP (Offensive Security Certified Professional) CISSP (Certified Information Systems Security Professional) CompTIA Security+
๐Ÿ“ฐ ๋ณด์•ˆ ๋‰ด์Šค ๋ฐ ๋ธ”๋กœ๊ทธ โ€ข OWASP: https://owasp.org
โ€ข Krebs on Security: https://krebsonsecurity.com
โ€ข The Hacker News: https://thehackernews.com
โ€ข Schneier on Security: https://www.schneier.com
โ€ข ๋ณด์•ˆ๋‰ด์Šค: https://www.boannews.com
โ€ข KISA ์ธํ„ฐ๋„ท ๋ณดํ˜ธ๋‚˜๋ผ: https://www.boho.or.kr
๐Ÿ’ก ์žฌ๋Šฅ๋„ท์—์„œ ๋ณด์•ˆ ์Šคํ„ฐ๋”” ๊ทธ๋ฃน ๋งŒ๋“ค๊ธฐ ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๊ธฐ ํž˜๋“ค๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ™์€ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค๊ณผ ์Šคํ„ฐ๋”” ๊ทธ๋ฃน์„ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์•„! ํ•จ๊ป˜ CTF ๋ฌธ์ œ๋ฅผ ํ’€๊ฑฐ๋‚˜, ๋ณด์•ˆ ๋…ผ๋ฌธ์„ ์ฝ๊ณ  ํ† ๋ก ํ•˜๋ฉด์„œ ์‹ค๋ ฅ์„ ํ‚ค์šธ ์ˆ˜ ์žˆ์–ด. ๐Ÿค

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์™€, ์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ์ง€? ๐Ÿ˜… ์‘์šฉํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณด์•ˆ ์ ๊ฒ€๊ณผ ์ทจ์•ฝ์  ๋ถ„์„์— ๋Œ€ํ•ด ๋งŽ์€ ๋‚ด์šฉ์„ ๋‹ค๋ค˜์–ด. ์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•˜๊ณ  ์–ด๋ ต๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•˜๋‚˜์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์ตํ˜€๊ฐ€๋‹ค ๋ณด๋ฉด ์–ด๋А์ƒˆ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋˜์–ด ์žˆ์„ ๊ฑฐ์•ผ!

๐ŸŽ“ ํ•ต์‹ฌ ์š”์•ฝ 1. ๋ณด์•ˆ์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜
๊ฐœ๋ฐœ์ž๋กœ์„œ ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•  ์ฑ…์ž„์ด ์žˆ์–ด. ๋ณด์•ˆ์„ ๋‚˜์ค‘์œผ๋กœ ๋ฏธ๋ฃจ์ง€ ๋ง๊ณ , ๊ฐœ๋ฐœ ์ดˆ๊ธฐ๋ถ€ํ„ฐ ๊ณ ๋ คํ•ด์•ผ ํ•ด.

2. ๊ณต๊ฒฉ์ž์˜ ๊ด€์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ธฐ
๋‚ด๊ฐ€ ๋งŒ๋“  ์‹œ์Šคํ…œ์„ ์–ด๋–ป๊ฒŒ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์ƒ์ƒํ•ด๋ณด๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ. ์ด๊ฒŒ ์ทจ์•ฝ์ ์„ ์ฐพ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ.

3. ์ง€์†์ ์ธ ํ•™์Šต
๋ณด์•ˆ์€ ๋์ด ์—†๋Š” ๋ถ„์•ผ์•ผ. ์ƒˆ๋กœ์šด ์ทจ์•ฝ์ ๊ณผ ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ด ๊ณ„์† ๋‚˜์˜ค๋‹ˆ๊นŒ, ๊พธ์ค€ํžˆ ๊ณต๋ถ€ํ•˜๊ณ  ์ตœ์‹  ํŠธ๋ Œ๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€์•ผ ํ•ด.

4. ์ž๋™ํ™”์™€ ํ†ตํ•ฉ
๋ณด์•ˆ ์ ๊ฒ€์„ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•ด์„œ ์ž๋™ํ™”ํ•˜๋ฉด, ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์–ด.

5. ํŒ€์›Œํฌ์™€ ๋ฌธํ™”
๋ณด์•ˆ์€ ํ˜ผ์ž ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ. ํŒ€ ์ „์ฒด๊ฐ€ ๋ณด์•ˆ์˜ ์ค‘์š”์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ํ˜‘๋ ฅํ•ด์•ผ ํšจ๊ณผ์ ์ด์•ผ.

๋ณด์•ˆ์€ ํ•œ ๋ฒˆ ์„ค์ •ํ•˜๊ณ  ๋๋‚˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ง€์†์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ๊ฐœ์„ ํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์•ผ. ์™„๋ฒฝํ•œ ๋ณด์•ˆ์€ ์—†์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์„ ๋‹คํ•ด์•ผ ํ•ด. ๐Ÿ›ก๏ธ

์ด ๊ธ€์ด ์‘์šฉํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณด์•ˆ ์ ๊ฒ€๊ณผ ์ทจ์•ฝ์  ๋ถ„์„์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์–ด. ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๊ฑฐ๋‚˜ ๋” ๊นŠ์ด ์žˆ๋Š” ๋‚ด์šฉ์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด, ๋ณด์•ˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ฐธ์—ฌํ•˜๊ฑฐ๋‚˜ ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ. ๐Ÿ’ช

์ž, ์ด์ œ ๋‹น์‹ ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ณด์ž! ํ™”์ดํŒ…! ๐Ÿš€

๐ŸŽ‰ ๋ณด์•ˆ์€ ๋ชจ๋‘์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค!

์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์‚ฌ์šฉ์ž๋ฅผ ๋ณดํ˜ธํ•˜๋ฉฐ,
๋” ๋‚˜์€ ์ธํ„ฐ๋„ท ์„ธ์ƒ์„ ๋งŒ๋“ค์–ด๊ฐ€์š”! ๐Ÿ’™

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.