C# ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ

์•Œ์•„์•ผ ํ•  C# ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ

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

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

C# ์ฝ”๋“œ ์œ„ํ—˜ ๋ถ„์„

Smart TS XL์€ ์‹คํ–‰ ๊ฒฝ๋กœ์™€ ์•„ํ‚คํ…์ฒ˜ ์œ„ํ—˜ ๋…ธ์ถœ์„ ์—ฐ๊ด€์‹œ์ผœ C# ์ •์  ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

์ง€๊ธˆ ํƒ์ƒ‰

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

C# ์ƒํƒœ๊ณ„๋Š” ๋‹ค์–‘ํ•œ ์ •์  ๋ถ„์„ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” Visual Studio์— ์ง์ ‘ ํ†ตํ•ฉ๋˜์–ด ๊ฐœ๋ฐœ ์ค‘ ์‹ค์‹œ๊ฐ„ ํ”ผ๋“œ๋ฐฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์€ ๋”์šฑ ์‹ฌ์ธต์ ์ธ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•˜๊ณ  ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํ†ตํ•ฉ๋˜์–ด ์ง€์†์ ์ธ ํ’ˆ์งˆ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋„๊ตฌ๋Š” ๋…ผ๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ์กฐ๊ธฐ์— ํฌ์ฐฉํ•˜๊ฑฐ๋‚˜, ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜, ๋ณด์•ˆ ์ •์ฑ…์„ ์ค€์ˆ˜ํ•˜๋Š” ๋“ฑ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

C# ๊ฐœ๋ฐœ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฃผ์š” ์ •์  ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”. ๊ฐ ๋„๊ตฌ์˜ ๊ธฐ๋Šฅ์„ ๋น„๊ตํ•˜๊ณ , ๊ฐ•์ ์„ ๊ฐ•์กฐํ•˜๋ฉฐ, ์ตœ์‹  ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์—์„œ ๊ฐ ๋„๊ตฌ๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ถ€๋ถ„์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ํ’ˆ์งˆ ํ–ฅ์ƒ, ๋ฒ„๊ทธ ๊ฐ์†Œ, ๋ณด์•ˆ ๊ฐ•ํ™”, ์›ํ™œํ•œ ์ฝ”๋“œ ๊ฒ€ํ†  ๋“ฑ ์–ด๋–ค ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•˜๋“ , ์ ํ•ฉํ•œ ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋น ๋ฅด๊ณ  ์ž์‹  ์žˆ๊ฒŒ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐจ๋ก€

SMART TS XL

SMART TS XL ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ตœ์ ํ™”๋œ ํฌ๊ด„์ ์ธ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ์†”๋ฃจ์…˜์œผ๋กœ ๋‹๋ณด์ด๋ฉฐ, C#์„ ์ง€์›ํ•˜์—ฌ ์ตœ์‹  .NET ์ƒํƒœ๊ณ„์—์„œ ๊ฐ•๋ ฅํ•œ ๊ฒฝ์Ÿ๋ ฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ์˜ ๋ณต์žกํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์— ๋งž์ถฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. SMART TS XL ์ฝ”๋“œ ๊ตฌ์กฐ, ํ๋ฆ„ ๋ฐ ์ƒํ˜ธ ์ข…์†์„ฑ์— ๋Œ€ํ•œ ์‹ฌ์ธต์ ์ธ ๊ฐ€์‹œ์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ๊ฐœ๋ฐœ์ž์™€ ํŒ€์ด ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ, ๊ทœ์ • ์ค€์ˆ˜ ๋ฐ ์œ„ํ—˜ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์Šจ ์„ธํŠธ SMART TS XL ์ด ์†”๋ฃจ์…˜์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๋†’์€ ์ˆ˜์ค€์˜ ์•„ํ‚คํ…์ฒ˜ ํ†ต์ฐฐ๋ ฅ๊ณผ ์„ธ๋ถ€์ ์ธ ์ฝ”๋“œ ์ˆ˜์ค€ ์ง„๋‹จ์„ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ ์ตœ์‹  C# ์ฝ”๋“œ๊ฐ€ ๊ณต์กดํ•˜์—ฌ ์–ธ์–ด ๊ฐ„ ๋ถ„์„๊ณผ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ฝ”๋“œ๋ฒ ์ด์Šค ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. SMART TS XL ๊ฐ์‚ฌ ์ถ”์ , ๊ทœ์น™ ์‹œํ–‰, ์ถ”์ ์„ฑ์ด ์ค‘์š”ํ•œ ๊ทœ์ œ๊ฐ€ ์—„๊ฒฉํ•œ ์‚ฐ์—…์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ ์žฅ์  SMART TS XL C# ์ •์  ๋ถ„์„์šฉ

  • ํด๋ž˜์Šค, ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฐ ์„œ๋น„์Šค ์ „๋ฐ˜์˜ ์ „์ฒด ํ˜ธ์ถœ ํ๋ฆ„๊ณผ ๋…ผ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ C# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์˜ ์ˆจ๊ฒจ์ง„ ์ข…์†์„ฑ๊ณผ ์“ธ๋ชจ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋”ฉ ํ‘œ์ค€ ๋ฐ ์•„ํ‚คํ…์ฒ˜ ์ •์ฑ…์„ ์‹œํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํ†ตํ•ฉํ•˜์—ฌ ํ’ˆ์งˆ ๊ฒ€์‚ฌ ๋ฐ ์ฝ”๋“œ ๊ฒ€์ฆ์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌํŒฉํ† ๋ง ๋ฐ ํ˜„๋Œ€ํ™” ๋…ธ๋ ฅ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ์˜ํ–ฅ ๋ถ„์„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜์ฒœ ๊ฐœ์˜ ํŒŒ์ผ๊ณผ ์—ฌ๋Ÿฌ ์ฝ”๋“œ ์ €์žฅ์†Œ์— ๊ฑธ์ณ ํšจ๊ณผ์ ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.
  • OWASP, ISO, MISRA์™€ ๊ฐ™์€ ๋ณด์•ˆ ๋ฐ ์‚ฐ์—… ํ‘œ์ค€ ์ค€์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

SMART TS XL ๋ณต์žกํ•œ C# ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ œ์–ด๋ ฅ์„ ๊ฐ•ํ™”ํ•˜๊ณ , ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ค„์ด๋ฉฐ, ์žฅ๊ธฐ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋ ค๋Š” ์กฐ์ง์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ์œ ์—ฐํ•œ ์•„ํ‚คํ…์ฒ˜์™€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์ด ์†”๋ฃจ์…˜์€ ์ง€์† ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ „ํ•œ .NET ๊ฐœ๋ฐœ์— ์ค‘์ ์„ ๋‘” ๊ฐœ๋ฐœ์ž, ์„ค๊ณ„์ž ๋ฐ IT ๋ฆฌ๋”์—๊ฒŒ ๋งค์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ์ƒคํผ

JetBrains์—์„œ ๊ฐœ๋ฐœํ•œ ReSharper๋Š” C# ๋ฐ ๋” ๋„“์€ .NET ์ƒํƒœ๊ณ„๋ฅผ ์œ„ํ•œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๊ณ  ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ์ •์  ๋ถ„์„ ๋ฐ ์ƒ์‚ฐ์„ฑ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. Visual Studio์— ์ง์ ‘ ํ†ตํ•ฉ๋œ ReSharper๋Š” ์‹ค์‹œ๊ฐ„ ์ฝ”๋“œ ๊ฒ€์‚ฌ, ์ง€๋Šฅํ˜• ์ œ์•ˆ, ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋Šฅ ๋ฐ ์ฝ”๋“œ ํƒ์ƒ‰ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ฝ”๋”ฉ ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ C# ์–ธ์–ด ๊ธฐ๋Šฅ๊ณผ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ง€์›ํ•˜์—ฌ ๋งŽ์€ ์ „๋ฌธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ๋กœ ์ž๋ฆฌ๋งค๊น€ํ–ˆ์Šต๋‹ˆ๋‹ค.

ReSharper C# ๋ถ„์„

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

์žฅ์ 

  • ์›ํ™œํ•œ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์œ„ํ•œ Visual Studio์™€์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ
  • C#, ASP.NET, XAML ๋ฐ ๊ธฐํƒ€ .NET ์–ธ์–ด์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ์ฝ”๋“œ ๊ฒ€์‚ฌ
  • 2,000๊ฐœ ์ด์ƒ์˜ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ ๋ฐ ์ˆ˜์‹ญ ๊ฐœ์˜ ๋ฆฌํŒฉํ† ๋ง
  • ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค ํƒ์ƒ‰์„ ์œ„ํ•œ ์ฆ‰๊ฐ์ ์ธ ์ฝ”๋“œ ํƒ์ƒ‰ ๋ฐ ๊ฒ€์ƒ‰ ๋„๊ตฌ
  • ์ปจํ…์ŠคํŠธ ์ธ์‹ ์ฝ”๋“œ ์™„์„ฑ ๋ฐ ๊ตฌ๋ฌธ ์ œ์•ˆ
  • ํŒ€๋ณ„ ํ‘œ์ค€์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ๊ฒ€์‚ฌ ์‹ฌ๊ฐ๋„ ๋ฐ ๊ทœ์น™
  • NUnit, MSTest, xUnit ๋“ฑ์„ ์ง€์›ํ•˜๋Š” ๋‚ด์žฅ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ

ํ•œ๊ณ„์™€ ๋‹จ์ 

ReSharper๋Š” ๊ทธ ์žฅ์ ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋Œ€๊ทœ๋ชจ ๋˜๋Š” CI ํ†ตํ•ฉ ์ •์  ๋ถ„์„ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์ ํ•ฉ์„ฑ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ฃผ๋ชฉํ•  ๋งŒํ•œ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ
    ReSharper๋Š” ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์†”๋ฃจ์…˜์—์„œ Visual Studio์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. IDE ์‘๋‹ต ์†๋„๋ฅผ ์ €ํ•˜์‹œ์ผœ ๋ณต์žกํ•œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์–ด๋ ค์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋…๋ฆฝํ˜• CLI ๋˜๋Š” CI ํˆด์ฒด์ธ ํ†ตํ•ฉ ์—†์Œ
    ReSharper๋Š” Visual Studio ๋‚ด์—์„œ ๋Œ€ํ™”ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›๋˜๋Š” ๋…๋ฆฝํ˜• ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ง€์†์  ํ†ตํ•ฉ ์›Œํฌํ”Œ๋กœ์—์„œ ์ž๋™ํ™”๋œ ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ œํ•œ๋œ ๊ฑด์ถ• ๋ถ„์„
    ReSharper๋Š” ์ฝ”๋“œ ์ˆ˜์ค€์˜ ๋ฌธ์ œ์—๋Š” ๋งค์šฐ ์œ ์šฉํ•˜์ง€๋งŒ, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋‚˜ ํฌ๋กœ์Šค ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ™˜๊ฒฝ์—์„œ ์•„ํ‚คํ…์ฒ˜ ์ข…์†์„ฑ ๋งต, ์‹œ์Šคํ…œ ์ „์ฒด ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„, ๊ณ ๊ธ‰ ํ๋ฆ„ ๋ถ„์„ ๊ธฐ๋Šฅ์€ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ต์ฐจ ์–ธ์–ด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ReSharper๋Š” ์ฃผ๋กœ .NET์— ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Java, C++ ๋˜๋Š” COBOL์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๊ตญ์–ด ์‹œ์Šคํ…œ์„ ์ง€์›ํ•˜์ง€ ์•Š์•„ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ ํ˜„๋Œ€ํ™” ํ™˜๊ฒฝ์—์„œ์˜ ํšจ์œจ์„ฑ์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ์ƒ์—… ๋ผ์ด์„ผ์Šค
    ReSharper๋Š” ์‚ฌ์šฉ์ž๋‹น ๋ผ์ด์„ ์Šค๊ฐ€ ์ ์šฉ๋˜๋Š” ์œ ๋ฃŒ ์ œํ’ˆ์ž…๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ํŒ€์˜ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๋‹น ๋น„์šฉ ์—†์ด ๊ด‘๋ฒ”์œ„ํ•œ ์ž๋™ํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ๋˜๋Š” CI ๊ธฐ๋ฐ˜ ๋„๊ตฌ์— ๋น„ํ•ด ์ƒ๋‹นํ•œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ด์žฅ๋œ ๋ณด์•ˆ ์Šค์บ๋‹์ด ์—†์Šต๋‹ˆ๋‹ค
    ReSharper์—๋Š” ์ฃผ์ž… ์ทจ์•ฝ์ , ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์•”ํ˜ธํ™”, ์ธ์ฆ ๋ฌธ์ œ ๊ฐ์ง€ ๋“ฑ ์ „๋‹ด ์ •์  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ํ…Œ์ŠคํŠธ(SAST) ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ ๊ฐœ๋ฐœ ๊ด€ํ–‰์„ ์œ„ํ•ด์„œ๋Š” ๋ณด์™„์ ์ธ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ReSharper๋Š” Visual Studio ๋‚ด์—์„œ ๊ฐœ์ธ ๋ฐ ํŒ€ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ตœ๊ณ ์˜ ๋„๊ตฌ๋กœ ์ž๋ฆฌ๋งค๊น€ํ–ˆ์œผ๋ฉฐ, ๋น ๋ฅธ ๊ฐœ๋ฐœ ์ฃผ๊ธฐ์™€ ์ฝ”๋“œ ๊ฒ€ํ† ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ CI ์ค‘์‹ฌ, ํ™•์žฅ ๊ฐ€๋Šฅ ๋˜๋Š” ๋ณด์•ˆ ์ค‘์‹ฌ์˜ ์ •์  ๋ถ„์„์„ ์›ํ•˜๋Š” ์กฐ์ง์€ ๋‹ค๋ฅธ ๋„๊ตฌ๋กœ ๋ณด์™„ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ์Šฌ๋ฆฐ ๋ถ„์„๊ธฐ

๋กœ์Šฌ๋ฆฐ ๋ถ„์„๊ธฐ C#

Roslyn ๋ถ„์„๊ธฐ๋Š” ์ตœ์‹  C# ๋ฐ Visual Basic .NET ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌ๋™ํ•˜๋Š” Roslyn ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋žซํผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ ์˜คํ”ˆ ์†Œ์Šค ์ง„๋‹จ ๋„๊ตฌ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. Microsoft์—์„œ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ด ๋ถ„์„๊ธฐ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” .NET ์ƒํƒœ๊ณ„ ๋‚ด์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ์ •์  ์ฝ”๋“œ ๊ทœ์น™์„ ์ž‘์„ฑ, ์ ์šฉ ๋ฐ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์™€ Visual Studio์— ์ง์ ‘ ํ†ตํ•ฉ๋˜์–ด ์žˆ์–ด ๋กœ์ปฌ ๊ฐœ๋ฐœ ๋ฐ ์ง€์†์ ์ธ ํ†ตํ•ฉ(CI) ๋ชจ๋‘์— ๊ฐ€๋ณ๊ณ  ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

Roslyn ๋ถ„์„๊ธฐ๋Š” Microsoft.CodeAnalysis, .NET SDK ๋ถ„์„๊ธฐ, Microsoft ์ž์ฒด ๋ณด์•ˆ, API ๋ฐ ํ˜ธํ™˜์„ฑ ์ง€์นจ์„ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ๊ทœ์น™ ์„ธํŠธ์˜ ๊ธฐ๋ฐ˜์ด ๋ฉ๋‹ˆ๋‹ค. Roslyn ๋ถ„์„๊ธฐ๋Š” ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ์ผ๋ฐ˜์ ์ธ ๋ฒ„๊ทธ๋ฅผ ํฌ์ฐฉํ•˜๊ณ , ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์ž๋™ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ C# ํ”„๋กœ์ ํŠธ ์ „๋ฐ˜์— ์Šคํƒ€์ผ ๊ทœ์น™์„ ์ ์šฉํ•˜๋Š” ๋ฐ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

์žฅ์ 

  • .NET SDK์— ๋‚ด์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ Microsoft์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
  • ๊ณต์‹ Microsoft ์ง€์นจ ๋ฐ ์Šคํƒ€์ผ ๊ทœ์น™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Visual Studio ๋ฐ MSBuild ํ”„๋กœ์„ธ์Šค์— ๊ธฐ๋ณธ์ ์œผ๋กœ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ์œ ์—ฐํ•œ API๋ฅผ ํ†ตํ•ด C#์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™ ์ž‘์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ค์‹œ๊ฐ„ ํ”ผ๋“œ๋ฐฑ ๋ฐ CI ํŒŒ์ดํ”„๋ผ์ธ ํ†ตํ•ฉ์— ํšจ์œจ์ 
  • OmniSharp๋ฅผ ํ†ตํ•ด Visual Studio Code์™€ ํ˜ธํ™˜ ๊ฐ€๋Šฅ
  • ์ง€์†์ ์ธ ์—…๋ฐ์ดํŠธ์™€ ๊ทœ์น™ ๊ฐœ์„ ์„ ํ†ตํ•ด ์ปค๋ฎค๋‹ˆํ‹ฐ ์ค‘์‹ฌ์ด ๋ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

์œ ์šฉ์„ฑ๊ณผ ๊ธฐ๋ณธ ํ†ตํ•ฉ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Roslyn Analyzer๋Š” ๊ณ ๊ธ‰ ์ •์  ๋ถ„์„ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ธก๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ ํ๋ฆ„ ๋ฐ ์•„ํ‚คํ…์ฒ˜ ๋ถ„์„์˜ ์‹ฌ๋„ ์ œํ•œ
    Roslyn ๋ถ„์„๊ธฐ๋Š” ์ฃผ๋กœ ๊ตฌ๋ฌธ ๋ฐ ์˜๋ฏธ ์ˆ˜์ค€์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‹ฌ์ธต์ ์ธ ํ”„๋กœ์‹œ์ € ๊ฐ„ ํ๋ฆ„ ๋ถ„์„, ํ”„๋กœ์ ํŠธ ๊ฐ„ ์ข…์†์„ฑ ๋งคํ•‘, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋„๊ตฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™ ์ ์šฉ ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. SMART TS XL ๋˜๋Š” NDepend ์ œ์•ˆ.
  • ๋‚ด์žฅ๋œ ๋ณด์•ˆ ๊ทœ์น™ ์„ธํŠธ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
    ๊ธฐ๋ณธ Roslyn ๋ถ„์„๊ธฐ๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์‚ญ์ œ, ๋ฐ์ดํ„ฐ ์œ ์ถœ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ API ์‚ฌ์šฉ๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ์ทจ์•ฝ์ ์— ์ดˆ์ ์„ ๋งž์ถ”์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SAST ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ณด์•ˆ ์ค‘์‹ฌ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ(์˜ˆ: Microsoft ๋ณด์•ˆ ์ฝ”๋“œ ๋ถ„์„)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์†Œํ•œ์˜ ์‹œ๊ฐํ™” ๋„๊ตฌ
    ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„, ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„ ๋˜๋Š” ํ’๋ถ€ํ•œ UI ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์‹œ๊ฐ์  ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•ด ํ…์ŠคํŠธ ์ถœ๋ ฅ์ด๋‚˜ ํƒ€์‚ฌ ํ†ตํ•ฉ์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™์— ๋Œ€ํ•œ ์œ ์ง€ ๊ด€๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ
    ๊ทœ์น™ ์‚ฌ์šฉ์ž ์ •์˜๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, Roslyn API์— ๋Œ€ํ•œ ์‹ฌ์ธต์ ์ธ ์ง€์‹๊ณผ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ์ •๊ธฐ์ ์ธ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ „๋ฌธ ๋„๊ตฌ ์‚ฌ์šฉ ๊ฒฝํ—˜์ด ์—†๋Š” ํŒ€์—๊ฒŒ๋Š” ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ์˜ค๋ฅ˜ ๋ณด๊ณ  ๋ฐ ์›Œํฌํ”Œ๋กœ ํ†ตํ•ฉ
    SonarQube๋‚˜ CodeQL๊ณผ ๊ฐ™์€ ๋„๊ตฌ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ Roslyn Analyzer๋Š” ๋ณด๊ณ  ๋Œ€์‹œ๋ณด๋“œ, ๋ฌธ์ œ ์ถ”์  ๊ธฐ๋Šฅ, GitHub PR ๋ฆฌ๋ทฐ๋‚˜ Jira์™€ ๊ฐ™์€ ํ”Œ๋žซํผ๊ณผ์˜ ํ†ตํ•ฉ ๊ธฐ๋Šฅ์ด ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.
  • ๋‹ค๊ตญ์–ด ์†”๋ฃจ์…˜์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ์ด๋Ÿฌํ•œ ๋ถ„์„๊ธฐ๋Š” C# ๋ฐ VB.NET ์ „์šฉ์ž…๋‹ˆ๋‹ค. JavaScript, C++, COBOL ๋˜๋Š” ๊ธฐํƒ€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์–ธ์–ด๊ฐ€ ํฌํ•จ๋œ ํ˜ผํ•ฉ ์Šคํƒ์€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Roslyn ๋ถ„์„๊ธฐ๋Š” C# ์ฝ”๋“œ์˜ ํ’ˆ์งˆ ์œ ์ง€๋ฅผ ์œ„ํ•œ ๊ฐ€๋ณ๊ณ  ํšจ๊ณผ์ ์ธ 1์ฐจ ๋ฐฉ์–ด์„ ์ž…๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ ์œ ์ง€, ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ ์กฐ๊ธฐ ๋ฐœ๊ฒฌ, ์ตœ์†Œํ•œ์˜ ์„ค์ •์œผ๋กœ CI ์›Œํฌํ”Œ๋กœ ํ†ตํ•ฉ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ฌ์ธต์ ์ธ ์ธ์‚ฌ์ดํŠธ, ๋ณด์•ˆ ๊ทœ์ • ์ค€์ˆ˜ ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฑฐ๋ฒ„๋„Œ์Šค๊ฐ€ ํ•„์š”ํ•œ ์กฐ์ง์˜ ๊ฒฝ์šฐ, Roslyn ๋ถ„์„๊ธฐ๋Š” ๋”์šฑ ๊ฐ•๋ ฅํ•œ ์ •์  ๋ถ„์„ ํ”Œ๋žซํผ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

NDepend

NDepend๋Š” C#์„ ํฌํ•จํ•œ .NET ์ฝ”๋“œ๋ฒ ์ด์Šค์šฉ์œผ๋กœ ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ ๊ฐ•๋ ฅํ•œ ์ •์  ๋ถ„์„ ๋ฐ ์•„ํ‚คํ…์ฒ˜ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ณ ๊ธ‰ ์ฝ”๋“œ ๋ฉ”ํŠธ๋ฆญ, ์ข…์†์„ฑ ์‹œ๊ฐํ™”, ์ฝ”๋“œ ๊ทœ์น™ ์ ์šฉ ๋ฐ ๊ธฐ์ˆ  ๋ถ€์ฑ„ ์ถ”์  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. NDepend๋Š” Visual Studio, CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํ†ตํ•ฉ๋˜๋ฉฐ, ์ž์ฒด LINQ ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ ์–ธ์–ด(CQLinq)๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ๊ทœ์น™ ์ •์˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

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

์žฅ์ 

  • ๊ด‘๋ฒ”์œ„ํ•œ ์ฝ”๋“œ ์ธก์ • ํ•ญ๋ชฉ(์˜ˆ: ์ˆœํ™˜ ๋ณต์žก๋„, ๊ฒฐํ•ฉ, ์‘์ง‘๋ ฅ)
  • ์•„ํ‚คํ…์ฒ˜ ์‹œ๊ฐํ™”๋ฅผ ์œ„ํ•œ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„ ๋ฐ ํ–‰๋ ฌ
  • ์ฝ”๋“œ ๊ทœ์น™์„ ์ž‘์„ฑํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ CQLinq ์ฟผ๋ฆฌ ์–ธ์–ด
  • ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ์ถ”์„ธ ๋ถ„์„ ๋ฐ ๊ธฐ์ˆ  ๋ถ€์ฑ„ ์ถ”์  ์ง€์›
  • Visual Studio ๋ฐ Azure DevOps์™€์˜ ํ†ตํ•ฉ
  • ์†Œ์Šค ์ฝ”๋“œ์™€ ์ปดํŒŒ์ผ๋œ ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•œ ์ •์  ๋ถ„์„
  • ์ฝ”๋“œ ๋ƒ„์ƒˆ, ์•ˆํ‹ฐํŒจํ„ด ๋ฐ ์ž ์žฌ์  ๋ฆฌํŒฉํ† ๋ง ๋Œ€์ƒ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ, ๊ณ„์ธตํ˜• ๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

NDepend๋Š” ๋ถ„์„ ๋ฐ ์‹œ๊ฐํ™”์— ์žˆ์–ด์„œ ๋น„๊ตํ•  ์ˆ˜ ์—†์„ ๋งŒํผ ์‹ฌ์ธต์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ํŠน์ • ํ™˜๊ฒฝ์—์„œ์˜ ๋„์ž…์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณต์žก์„ฑ๊ณผ ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ 
    NDepend์˜ ๊ด‘๋ฒ”์œ„ํ•œ ๊ธฐ๋Šฅ, ํŠนํžˆ CQLinq์™€ ์ข…์†์„ฑ ๋งคํ•‘์€ ์ดˆ๋ณด์ž์—๊ฒŒ๋Š” ๋ถ€๋‹ด์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์€ ๊ธฐ๋Šฅ์„ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ต์œก์ด ํ•„์š”ํ•˜๋ฉฐ, ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ์„ค์ •์ด ์ง๊ด€์ ์ด์ง€ ์•Š๋‹ค๊ณ  ๋А๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ ์ค‘ ์‹ค์‹œ๊ฐ„ ํ”ผ๋“œ๋ฐฑ์ด ์ œํ•œ๋จ
    ReSharper๋‚˜ Roslyn Analyzers์ฒ˜๋Ÿผ ํŽธ์ง‘๊ธฐ ๋‚ด์—์„œ ์ฆ‰๊ฐ์ ์ธ ์ง„๋‹จ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ์™€ ๋‹ฌ๋ฆฌ, NDepend์˜ ํ”ผ๋“œ๋ฐฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ„์„ ์ดํ›„์— ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋™ ๋˜๋Š” ์˜ˆ์•ฝ ์‹คํ–‰์„ ์‹คํ–‰ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Visual Studio ์ข…์†์„ฑ
    NDepend๋Š” ๋ช…๋ น์ค„ ๋ฐ CI ํ†ตํ•ฉ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ฐ€์žฅ ํ’๋ถ€ํ•œ ๊ธฐ๋Šฅ์€ Visual Studio์— ์ข…์†๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Rider ๋˜๋Š” Visual Studio Code๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ์™„์ „ํ•œ ์ง€์›์„ ๋ฐ›์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋ฉ”ํŠธ๋ฆญ์šฉ
    NDepend๋Š” ๊ตฌ์กฐ์  ๋ฐ ์•„ํ‚คํ…์ฒ˜์  ๊ฒ€์ฆ์— ํƒ์›”ํ•˜์ง€๋งŒ, ๊ตฌ๋ฌธ ์ˆ˜์ค€ ๋ฆฐํŒ…์ด๋‚˜ ์„œ์‹ ๊ทœ์น™๊ณผ ๊ฐ™์€ ํŠน์ • ์˜์—ญ์—์„œ๋Š” ๊นŠ์ด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. StyleCop์ด๋‚˜ EditorConfig์™€ ๊ฐ™์€ ๋ช…๋ช… ๊ทœ์น™์ด๋‚˜ ๊ณต๋ฐฑ ๊ทœ์น™์„ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‚ด์žฅ๋œ ๋ณด์•ˆ ์Šค์บ๋‹์ด ์—†์Šต๋‹ˆ๋‹ค
    ์ด ๋„๊ตฌ๋Š” SQL ์‚ฝ์ž…, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์•”ํ˜ธํ™”, ๊ฒฝ๋กœ ํšก๋‹จ ์œ„ํ—˜๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ์— ์ค‘์ ์„ ๋‘” ์กฐ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. SMART TS XL, CodeQL ๋˜๋Š” Veracode.
  • ์ƒ์—…์  ๋ผ์ด์„ ์Šค ๋ชจ๋ธ
    NDepend๋Š” ๋ผ์ด์„ ์Šค๋‹น ์š”๊ธˆ์ด ๋ถ€๊ณผ๋˜๋Š” ์œ ๋ฃŒ ์ œํ’ˆ์œผ๋กœ, Roslyn Analyzers๋‚˜ ESLint์™€ ๊ฐ™์€ ๋ฌด๋ฃŒ ์˜ต์…˜์— ๋น„ํ•ด ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ์—ฌ์ž์—๊ฒŒ๋Š” ๋ถ€๋‹ด์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๊ตญ์–ด ์ฝ”๋“œ๋ฒ ์ด์Šค์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    .NET ์ค‘์‹ฌ ๋„๊ตฌ์ธ NDepend๋Š” JavaScript, Python, COBOL ๋˜๋Š” ํ’€์Šคํƒ์ด๋‚˜ ๋ ˆ๊ฑฐ์‹œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐํƒ€ ๋น„ .NET ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

NDepend๋Š” C# ํ”„๋กœ์ ํŠธ์—์„œ ์žฅ๊ธฐ์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์•„ํ‚คํ…์ฒ˜์˜ ๋ช…ํ™•์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์  ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์‹ฌ๊ฐํ•œ ๊ตฌ์กฐ์  ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ํƒ์›”ํ•˜๋ฉฐ, ํŒ€์ด ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ •๋Ÿ‰ํ™”ํ•˜๊ณ  ๊ณ„์ธต์  ์„ค๊ณ„๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ „์ฒด์ ์ธ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ๊ฐ€๋ณ๊ณ  ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋›ฐ์–ด๋‚œ ๋ฆฐํ„ฐ์™€ ๋ณด์•ˆ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

PVS-์ŠคํŠœ๋””์˜ค

PVS-Studio๋Š” Program Verification Systems์—์„œ ๊ฐœ๋ฐœํ•œ ์ •์  ์ฝ”๋“œ ๋ถ„์„๊ธฐ๋กœ, C, C++, C#, Java ๋“ฑ ์—ฌ๋Ÿฌ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. C#์˜ ๊ฒฝ์šฐ, Visual Studio์™€ ํ†ตํ•ฉ๋˜์–ด ๋ฒ„๊ทธ, ์ฝ”๋“œ ์Šค๋ฉœ, ๋™์‹œ์„ฑ ๋ฌธ์ œ ๋ฐ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ํƒ์ง€ํ•˜๋Š” ์‹ฌ์ธต ๋ถ„์„ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. PVS-Studio๋Š” ๊ณ ์„ฑ๋Šฅ ํƒ์ง€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ, ๊ธˆ์œต ์„œ๋น„์Šค ๋ฐ ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ„์•ผ์˜ ๋งŽ์€ ํŒ€์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

PVC ์ŠคํŠœ๋””์˜ค C# ์ฝ”๋“œ ๋ถ„์„

๊ธฐ๋ณธ์ ์ธ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋ฅผ ๋„˜์–ด ๋ฏธ๋ฌ˜ํ•œ ๋…ผ๋ฆฌ ๋ฌธ์ œ, ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘, ์ฝ”๋”ฉ ํŒจํ„ด ์œ„๋ฐ˜๊นŒ์ง€ ์ฐพ์•„๋‚ด๋Š” ํฌ๊ด„์ ์ธ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ์ˆ˜๋™ ๋ฐ CI ํ†ตํ•ฉ ๋ถ„์„ ์›Œํฌํ”Œ๋กœ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  • ๋…ผ๋ฆฌ์  ๊ฒฐํ•จ๋ถ€ํ„ฐ ์„ฑ๋Šฅ ๋น„ํšจ์œจ์„ฑ๊นŒ์ง€ C#์˜ ๊ด‘๋ฒ”์œ„ํ•œ ์˜ค๋ฅ˜ ์œ ํ˜•์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • Visual Studio์™€ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜๋ฉฐ MSBuild ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ํ™” ๋ฐ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ฌ๊ฐ๋„ ๋ฐ ์˜คํƒ์ง€ ๊ฐ€๋Šฅ์„ฑ์— ๋”ฐ๋ฅธ ๊ฒฝ๊ณ  ๋ถ„๋ฅ˜ ์ œ๊ณต
  • ๊ฑฐ์ง“ ์–‘์„ฑ ์–ต์ œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์ „๋‹ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์ง„๋‹จ ๊ทœ์น™์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์„œ์™€ ์˜ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๋” ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์ฆ๋ถ„ ๋ถ„์„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

PVS-Studio๋Š” ๊ธฐ์ˆ ์  ๊ฐ•์ ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํŠน์ • ํ™˜๊ฒฝ์—์„œ์˜ ๋„์ž…์ด๋‚˜ ํšจ๊ณผ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ธก๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž์„ธํ•œ ์ถœ๋ ฅ ๋ฐ ๊ฒฝ๊ณ  ์†Œ์Œ
    PVS-Studio๋Š” ํŠนํžˆ ์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ ๋งŽ์€ ๊ฒฝ๊ณ ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ต์ œ ๋„๊ตฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ, ์ดˆ๊ธฐ ๊ฒฝ๊ณ ์Œ์ด ๋„ˆ๋ฌด ์ปค์„œ ์ƒ์‚ฐ์ ์ธ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์กฐ์ •ํ•˜๋Š” ๋ฐ ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทœ์น™์˜ ์ œํ•œ๋œ ์‚ฌ์šฉ์ž ์ •์˜
    Roslyn Analyzers๋‚˜ NDepend์™€ ๋‹ฌ๋ฆฌ PVS-Studio๋Š” ๊ฐ•๋ ฅํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™ ์—”์ง„์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋‚ด๋ถ€ ์•„ํ‚คํ…์ฒ˜๋‚˜ ์ฝ”๋”ฉ ํ‘œ์ค€์— ๋งž๋Š” ๋งž์ถคํ˜• ๊ทœ์น™์„ ์‰ฝ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ฑด์ถ•์  ํ†ต์ฐฐ๋ ฅ ๋ถ€์กฑ
    ์ด ๋„๊ตฌ๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฒ€์ฆ๋ณด๋‹ค๋Š” ์˜ค๋ฅ˜ ๊ฐ์ง€์— ์ฃผ๋กœ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„, ์ˆœํ™˜ ๋ณต์žก๋„ ์ถ”์ , ๊ณ„์ธต์  ์„ค๊ณ„ ์ ์šฉ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์€ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋†’์€ ๋ผ์ด์„ ์Šค ๋น„์šฉ
    PVS-Studio๋Š” ์†Œ๊ทœ๋ชจ ๊ฐœ๋ฐœํŒ€์ด๋‚˜ ๊ต์œก ํ™˜๊ฒฝ์—์„œ๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ผ์ด์„ ์Šค ๋ชจ๋ธ์„ ๊ฐ–์ถ˜ ์ƒ์šฉ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ฒดํ—˜ ๊ธฐ๊ฐ„ ์ดํ›„ ์ „๋ฌธ๊ฐ€์šฉ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๋ฌด๋ฃŒ ๋ฒ„์ „์€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ด์ง€ ์•Š์€ UX
    Visual Studio์™€์˜ ํ†ตํ•ฉ์€ ๊ธฐ๋Šฅ์ ์ด์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ReSharper๋‚˜ SonarQube ๋Œ€์‹œ๋ณด๋“œ์™€ ๊ฐ™์€ ๋„๊ตฌ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์„ธ๋ จ๋˜๊ณ  ์‚ฌ์šฉ์„ฑ ์žˆ๋Š” ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์šฉ SAST ๋„๊ตฌ๋ณด๋‹ค ๋ณด์•ˆ ์ดˆ์ ์ด ๋œ ๊ฐ•๋ ฅํ•จ
    PVS-Studio๋Š” ์ผ๋ถ€ ๋ณด์•ˆ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜์ง€๋งŒ, ์ „์šฉ ์ •์  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ํ…Œ์ŠคํŠธ ํ”Œ๋žซํผ์„ ๋Œ€์ฒดํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. OWASP ๊ทœ์น™ ์„ธํŠธ, ํ…Œ์ธํŠธ ๋ถ„์„ ๋ฐ ์ทจ์•ฝ์  ์ ์ˆ˜ ํ†ตํ•ฉ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ Microsoft ์Šคํƒ์— ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค.
    ์ด ๋„๊ตฌ๋Š” ์—ฌ๋Ÿฌ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, ์ตœ๊ณ ์˜ C# ๊ธฐ๋Šฅ์€ Microsoft ์ƒํƒœ๊ณ„์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ .NET Core ๋˜๋Š” VS Code ์‚ฌ์šฉ์€ ์ƒ๋Œ€์ ์œผ๋กœ ์ œํ•œ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PVS-Studio๋Š” ๋‹ค๋ฅธ ๋ถ„์„๊ธฐ์—์„œ๋Š” ๊ฐ„๊ณผํ•  ์ˆ˜ ์žˆ๋Š” C# ์ฝ”๋“œ ๊ฒฐํ•จ๊ณผ ์ˆจ๊ฒจ์ง„ ๋ฌธ์ œ๋ฅผ ํ‘œ๋ฉดํ™”ํ•˜๋Š” ๋ฐ ์žˆ์–ด ์„ฑ์ˆ™ํ•˜๊ณ  ๊ธฐ์ˆ ์ ์œผ๋กœ ๋›ฐ์–ด๋‚œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ, ์•ˆ์ „์ด ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ, ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€์ ์ธ ํ’ˆ์งˆ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ํŒ€์— ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทœ์น™ ์‚ฌ์šฉ์ž ์ •์˜, ์•„ํ‚คํ…์ฒ˜ ์ œ์–ด ๋˜๋Š” ๋”์šฑ ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ์›Œํฌํ”Œ๋กœ๋ฅผ ์›ํ•˜๋Š” ์กฐ์ง์˜ ๊ฒฝ์šฐ, ๋”์šฑ ์ƒํ˜ธ ์ž‘์šฉ์ ์ด๊ฑฐ๋‚˜ ์ „๋žต์ ์ธ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค๋ฒ„๋ฆฌํ‹ฐ(Synopsys)

Coverity๋Š” C#์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ •์  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ํ…Œ์ŠคํŠธ(SAST) ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ณด์•ˆ, ์•ˆ์ •์„ฑ ๋ฐ ๊ทœ์ • ์ค€์ˆ˜์— ์ค‘์ ์„ ๋‘๊ธฐ ๋•Œ๋ฌธ์— ๊ธˆ์œต, ํ•ญ๊ณต์šฐ์ฃผ, ์˜๋ฃŒ ๋ฐ ๊ธฐํƒ€ ๊ทœ์ œ ๋Œ€์ƒ ์‚ฐ์—… ๋ถ„์•ผ์˜ ์กฐ์ง์—์„œ ๋„๋ฆฌ ์ฑ„ํƒ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Coverity๋Š” ์‹ฌ์ธต์ ์ธ ์ •์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ค‘์š”ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฒฐํ•จ, ๋ณด์•ˆ ์ทจ์•ฝ์ , ๋™์‹œ์„ฑ ๋ฌธ์ œ ๋ฐ ๊ทœ์ • ์ค€์ˆ˜ ์œ„๋ฐ˜ ์‚ฌํ•ญ์„ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค. CWE, OWASP Top 10, MISRA์™€ ๊ฐ™์€ ์—…๊ณ„ ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜๋ฉฐ, ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ์˜ ํ™•์žฅ์„ฑ๊ณผ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๋ณด๊ณ  ๊ธฐ๋Šฅ์œผ๋กœ ์ •ํ‰์ด ๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  • ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ, ์ฃผ์ž… ๊ฒฐํ•จ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ API๋ฅผ ํฌํ•จํ•œ ๊ณ ๊ธ‰ ์ทจ์•ฝ์„ฑ ํƒ์ง€
  • ์—…๊ณ„ ํ‘œ์ค€(CWE, OWASP, PCI DSS ๋“ฑ)์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ๊ทœ์ • ์ค€์ˆ˜
  • Jenkins, GitHub Actions, Azure DevOps์™€ ๊ฐ™์€ Visual Studio ๋ฐ CI/CD ํ”Œ๋žซํผ๊ณผ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐํ•จ ์ˆ˜์ •์„ ์œ„ํ•œ ์ฝ”๋“œ ๋ถ„๋ฅ˜ ๋„๊ตฌ์™€ ํ˜‘์—… ์›Œํฌํ”Œ๋กœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ์ค‘์‹ฌ ๋ถ„์„ ์—”์ง„์„ ํ†ตํ•ด ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ค‘์•™ ์ง‘์ค‘์‹ ๋Œ€์‹œ๋ณด๋“œ ๋ฐ ๊ฐ์‚ฌ ๊ธฐ๋Šฅ ์ง€์›
  • ๋ณด์•ˆ ๋ฐ ์•ˆ์ „์„ ์œ„ํ•ด ํ๋ ˆ์ดํŒ…๋œ ๊ณ ํ’ˆ์งˆ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

Coverity๋Š” ํŠนํžˆ ๊ทœ์ œ๋œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•œ ์ฝ”๋“œ ๋ถ„์„์— ํƒ์›”ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž์™€ DevOps ํŒ€์ด ์•Œ์•„์•ผ ํ•  ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋งŽ์€ ์„ค์ • ๋ฐ ์ธํ”„๋ผ ์˜ค๋ฒ„ํ—ค๋“œ
    Coverity๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๋ฐ ์Šค์บ๋‹ ์ธํ”„๋ผ ๊ตฌ์„ฑ์„ ํฌํ•จํ•œ ์ƒ๋‹นํ•œ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ „๋‹ด DevSecOps ์ธ๋ ฅ์ด ์—†๋Š” ๋น ๋ฅด๊ฒŒ ์›€์ง์ด๋Š” ํŒ€์ด๋‚˜ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋†’์€ ๋ผ์ด์„ ์Šค ๋ฐ ์ง€์› ๋น„์šฉ
    ๊ฐ€๊ฒฉ ๊ตฌ์กฐ๋Š” ๋Œ€๊ธฐ์—…์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์†Œ๊ทœ๋ชจ ํšŒ์‚ฌ๋‚˜ ํ”„๋ฆฌ๋žœ์„œ ๊ฐœ๋ฐœ์ž๋Š” ์˜คํ”ˆ์†Œ์Šค ๋˜๋Š” ๊ฒฝ๋Ÿ‰ํ˜• ๋Œ€์•ˆ์— ๋น„ํ•ด ๋ผ์ด์„ ์Šค ๋น„์šฉ์ด ์—„์ฒญ๋‚˜๊ฒŒ ๋†’๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ฝ”๋”ฉ ์ค‘ ์‹ค์‹œ๊ฐ„ ํ”ผ๋“œ๋ฐฑ์ด ์ œํ•œ๋จ
    Coverity๋Š” ๋ฐฐ์น˜ ๋ชจ๋“œ ๋˜๋Š” CI ๊ธฐ๋ฐ˜ ์Šค์บ๋‹์—์„œ ๊ฐ€์žฅ ํšจ๊ณผ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” Roslyn ๋ถ„์„๊ธฐ, ReSharper ๋˜๋Š” Visual Studio ๊ธฐ๋ณธ ์ œ๊ณต ๋„๊ตฌ์ฒ˜๋Ÿผ ์ฆ‰๊ฐ์ ์ธ ์ธ๋ผ์ธ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ์„ ์œ„ํ•œ ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ 
    ๋ถ„์„ ํ”„๋กœํ•„, ์–ต์ œ ๋˜๋Š” ๊ทœ์น™์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜๋ ค๋ฉด Coverity์˜ ๊ณ ์œ ํ•œ ๊ตฌ์„ฑ ์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ๊ต์œก๊ณผ ์ˆ™์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๋Š” ๋ฐฉ๋Œ€ํ•˜์ง€๋งŒ ๋‚ด์šฉ์ด ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ์ง€ ๊ด€๋ฆฌ๋‚˜ ์•„ํ‚คํ…์ฒ˜๋ณด๋‹ค ๋ณด์•ˆ์— ๋” ์ค‘์ ์„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.
    Coverity๋Š” ๋ณด์•ˆ ๋ฐ ์•ˆ์ •์„ฑ ๊ฐ์ง€๋ฅผ ์ „๋ฌธ์œผ๋กœ ํ•˜์ง€๋งŒ NDepend์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„, ๊ธฐ์ˆ  ๋ถ€์ฑ„ ์ถ”์  ๋˜๋Š” ์ถ”์„ธ ์ธก์ •ํ•ญ๋ชฉ๊ณผ ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜ ๋„๊ตฌ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
  • UI ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ˜„๋Œ€ํ™”๋˜์ง€ ์•Š์Œ
    ๊ฐœ๋ฐœ์ž ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋Œ€์‹œ๋ณด๋“œ๋Š” ๊ธฐ๋Šฅ์ ์ด์ง€๋งŒ ์ตœ์‹  ๋””์ž์ธ ๊ธฐ์ค€์— ๋ฏธ์น˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. SonarQube๋‚˜ CodeClimate ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ค‘์‹ฌ ๋„๊ตฌ์— ๋น„ํ•ด Coverity๋Š” ๊ตฌ์‹์ด๊ณ  ๋ถˆํŽธํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฑฐ์ง“ ์–‘์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๊ธฐ์ ์ธ ์กฐ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    Coverity๋Š” ์ •ํ™•๋„๊ฐ€ ๋›ฐ์–ด๋‚˜๋‹ค๋Š” ํ‰๊ฐ€๋ฅผ ๋ฐ›๊ณ  ์žˆ์ง€๋งŒ, ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋Š” ํŠนํžˆ ๊ณ ๊ธ‰ ์–ธ์–ด ๊ธฐ๋Šฅ์ด๋‚˜ ์‚ฌ์šฉ์ž ์ง€์ • ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์˜คํƒ(false positive)์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทœ์น™ ๋ฐ ์ฐจ๋‹จ ๊ธฐ๋Šฅ์˜ ์ง€์†์ ์ธ ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Coverity๋Š” ๋ณด์•ˆ, ๊ทœ์ • ์ค€์ˆ˜, ์ฝ”๋“œ ์ •ํ™•์„ฑ์ด ํ•„์ˆ˜์ ์ธ ์กฐ์ง์„ ์œ„ํ•œ ์ตœ๊ณ ์˜ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์—„๊ฒฉํ•œ ๊ฒฐํ•จ ๋ถ„์„์ด ์š”๊ตฌ๋˜๋Š” ๋Œ€๊ทœ๋ชจ, ๊ทœ์ œ ๋Œ€์ƒ ๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ํŠน์„ฑ์ƒ ์ ์ ˆํ•œ ์ง€์›๊ณผ ๊ต์œก ์—†์ด๋Š” ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ๋น ๋ฅธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—๋Š” ๋ฏผ์ฒฉ์„ฑ์ด๋‚˜ ๊ฒฝ๋Ÿ‰์„ฑ์ด ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋Ÿฌ์‹œ

DevExpress์˜ CodeRush๋Š” ์ฝ”๋“œ ํƒ์ƒ‰, ๋ฆฌํŒฉํ† ๋ง, ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๋Š” Visual Studio์šฉ ์ƒ์‚ฐ์„ฑ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์— ์ค‘์ ์„ ๋‘๊ณ  ์„ค๊ณ„๋œ CodeRush๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ ํŽธ์˜์„ฑ์„ ํ–ฅ์ƒํ•˜๋Š” ๋™์‹œ์— C# ์ฝ”๋“œ ์ž‘์„ฑ, ์ฝ๊ธฐ ๋ฐ ํƒ์ƒ‰ ํšจ์œจ์„ฑ์„ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.

CodeRush๋Š” Coverity๋‚˜ PVS-Studio์™€ ๊ฐ™์€ ์ˆœ์ˆ˜ํ•œ ์ •์  ์ฝ”๋“œ ๋ถ„์„๊ธฐ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ค€์ˆ˜ํ•˜๊ณ , ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๊ณ , ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์‹ค์‹œ๊ฐ„ ์ฝ”๋“œ ์ง„๋‹จ ์—”์ง„์„ ํ†ตํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  • ์ตœ์†Œํ•œ์˜ ์„ค์ •์œผ๋กœ Visual Studio์— ์ง์ ‘ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ฆ‰๊ฐ์ ์ธ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋ฐ ์ œ์•ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • 100๊ฐœ ์ด์ƒ์˜ ์ž๋™ ๋ฆฌํŒฉํ† ๋ง ๋ฐ ์ฝ”๋“œ ํฌ๋งท ๋„๊ตฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž ์žฌ์ ์ธ ์„ฑ๋Šฅ ๋ฌธ์ œ, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ๋ฐ ์ž˜๋ชป๋œ ๊ด€ํ–‰์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ๋ฉ”ํŠธ๋ฆญ, ์ข…์†์„ฑ ๋ถ„์„, ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€์™€ ๊ฐ™์€ ์‹œ๊ฐ์  ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋ฐœ์ž ์ž‘์—…(์˜ˆ: ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ, ๋งค๊ฐœ๋ณ€์ˆ˜ ์žฌ์ •๋ ฌ, ํ‘œ์‹œ ์—ฌ๋ถ€ ๋ณ€๊ฒฝ)์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ์ ํŠธ ๋˜๋Š” ๊ฐœ๋ฐœ์ž ๊ธฐ๋ณธ ์„ค์ •์— ๋”ฐ๋ผ ๊ทœ์น™ ๊ตฌ์„ฑ ๋ฐ ์–ต์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๋ฉฐ ์ตœ์‹  C# ์›Œํฌํ”Œ๋กœ๋ฅผ ์ง€์›ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

๊ฐœ๋ณ„ ๊ฐœ๋ฐœ์ž์™€ ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๋งค๋ ฅ์ ์ด์ง€๋งŒ, CodeRush๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ •์  ๋ถ„์„ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ์˜ ์œ ์šฉ์„ฑ์„ ๊ฐ์†Œ์‹œํ‚ค๋Š” ๋ช‡ ๊ฐ€์ง€ ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ „์šฉ SAST ๋˜๋Š” ๋ณด์•ˆ ์Šค์บ๋„ˆ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
    CodeRush๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ, ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž ์ƒ์‚ฐ์„ฑ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์ทจ์•ฝ์  ํƒ์ง€๋‚˜ OWASP ๋˜๋Š” CWE์™€ ๊ฐ™์€ ํ‘œ์ค€ ์ค€์ˆ˜์—๋Š” ํŠนํ™”๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ์—… ๋ณด๊ณ  ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค
    CI ํŒŒ์ดํ”„๋ผ์ธ ์ „๋ฐ˜์˜ ํŒ€ ์ „์ฒด ๋ถ„์„์— ์ ํ•ฉํ•œ ์ค‘์•™ ์ง‘์ค‘์‹ ๋Œ€์‹œ๋ณด๋“œ, ๊ฒฐํ•จ ์ถ”์„ธ ์ถ”์  ๋˜๋Š” ๋ณด๊ณ  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ œํ•œ๋œ ๊ทœ์น™ ํ™•์žฅ์„ฑ
    Roslyn ๋ถ„์„๊ธฐ๋‚˜ NDepend์™€ ๊ฐ™์€ ๋„๊ตฌ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ, CodeRush๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ •์  ๋ถ„์„ ๊ทœ์น™์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜ ์ œ์•ฝ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ช…๋ น์ค„์ด๋‚˜ CI/CD ํ†ตํ•ฉ ์—†์Œ
    ๋ถ„์„์€ Visual Studio ํ™˜๊ฒฝ ๋‚ด์—์„œ๋งŒ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์ด๋‚˜ ์›๊ฒฉ ๋ถ„์„ ์ธํ”„๋ผ์—์„œ๋Š” ํ—ค๋“œ๋ฆฌ์Šค ์‹คํ–‰์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‹ฌ์ธต์ ์ธ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด๋‚˜ ์˜ค์—ผ ๋ถ„์„์ด ์—†์Šต๋‹ˆ๋‹ค.
    CodeRush๋Š” ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ ๋ถ„์„, ํ”„๋กœ์‹œ์ € ๊ฐ„ ์Šค์บ๋‹ ๋˜๋Š” ๊ณ ๊ธ‰ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ถ”์ ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ํŒŒ์ผ์ด๋‚˜ ๊ณ„์ธต์— ๊ฑธ์ณ ์žˆ๋Š” ๋ณต์žกํ•œ ๋ฒ„๊ทธ๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ’ˆ์งˆ ๊ฐ•ํ™”๋ณด๋‹ค ์ƒ์‚ฐ์„ฑ ์ค‘์‹ฌ
    SonarQube๋‚˜ Coverity์™€ ๊ฐ™์ด ๊ฒฐํ•จ์˜ ์ •ํ™•์„ฑ์„ ์šฐ์„ ์‹œํ•˜๋Š” ๋„๊ตฌ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ๊ฐœ๋ฐœ์ž์˜ ์ธ์ฒด๊ณตํ•™์— ์ดˆ์ ์„ ๋งž์ถ”๋ฉด ์ฝ”๋“œ ํ‘œ์ค€์„ ๋œ ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    CodeRush๋Š” ์†Œ๊ทœ๋ชจ์—์„œ ์ค‘๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ฐ˜์‘์„ฑ์ด ๋›ฐ์–ด๋‚˜์ง€๋งŒ, ์‹ฌ์ธต์ ์ธ ์ •์  ๊ฒ€์‚ฌ, ๊ฐ์‚ฌ ๋˜๋Š” ๊ทœ์ • ์ค€์ˆ˜ ํ‰๊ฐ€๊ฐ€ ํ•„์š”ํ•œ ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ €์žฅ์†Œ์—์„œ๋Š” ํšจ์œจ์ ์œผ๋กœ ํ™•์žฅ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CodeRush๋Š” ๊ฐœ๋ฐœ์ž ์ค‘์‹ฌ์˜ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ ๋„๊ตฌ๋กœ์„œ C#์— ๋Œ€ํ•œ ์œ ์šฉํ•œ ์ •์  ์ฝ”๋“œ ํ”ผ๋“œ๋ฐฑ๊ณผ ์Šค๋งˆํŠธ ๋ฆฌํŒฉํ† ๋ง์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ DevSecOps๋‚˜ ๋Œ€๊ทœ๋ชจ ํŒ€ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ณต์‹์ ์ธ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ํ”Œ๋žซํผ์„ ๋Œ€์ฒดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ ์ˆ˜์ค€์—์„œ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ๊ณผ ๊น”๋”ํ•œ โ€‹โ€‹์ฝ”๋“œ ์ž‘์„ฑ ์Šต๊ด€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

์Šคํƒ€์ผ์บ…

StyleCop์€ Microsoft์—์„œ ๊ฐœ๋ฐœํ•œ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ์ด๋ฉฐ ๋‚˜์ค‘์— ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์Šคํƒ€์ผ์บ… ๋ถ„์„๊ธฐ)๋Š” C#์—์„œ ์ผ๊ด€๋œ ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ์„œ์‹์„ ์ ์šฉํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. C# ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ •์˜๋œ ์Šคํƒ€์ผ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ฐ€๋…์„ฑ, ์œ ์ง€ ๊ด€๋ฆฌ ์šฉ์ด์„ฑ ๋ฐ ํŒ€ ์ผ๊ด€์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

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

์žฅ์ 

  • ํŒ€๊ณผ ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „๋ฐ˜์— ๊ฑธ์ณ ์ผ๊ด€๋œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ์‹, ์ด๋ฆ„ ์ง€์ •, ์ˆœ์„œ ์ง€์ • ๋ฐ ์ฃผ์„ ๋‹ฌ๊ธฐ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Visual Studio์™€ ํ†ตํ•ฉ๋˜์–ด ์žˆ์œผ๋ฉฐ Roslyn ๋ถ„์„๊ธฐ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ ์‹œ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์ค‘ ํ’ˆ์งˆ ์œ ์ง€์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ ํŒŒ์ผ์ด๋‚˜ ์ถ”๊ฐ€ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ํ†ตํ•ด ํ™•์žฅ ๊ฐ€๋Šฅ
  • ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ CI ํ™˜๊ฒฝ์— ์‰ฝ๊ฒŒ ํ†ตํ•ฉ(NuGet ๋˜๋Š” MSBuild๋ฅผ ํ†ตํ•ด)
  • ๊น”๋”ํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ž˜ ๋ฌธ์„œํ™”๋œ C# ์ฝ”๋“œ๋ฅผ ์žฅ๋ คํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

StyleCop์€ ํ‘œ์ค€ํ™”์— ์œ ์šฉํ•˜์ง€๋งŒ, ๋” ๊ด‘๋ฒ”์œ„ํ•œ ์ •์  ๋ถ„์„ ์ปจํ…์ŠคํŠธ์—์„œ์˜ ์˜ํ–ฅ๋ ฅ์„ ๊ฐ์†Œ์‹œํ‚ค๋Š” ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ •ํ™•์„ฑ์ด๋‚˜ ๋ณด์•ˆ์ด ์•„๋‹Œ ์ฝ”๋“œ ์Šคํƒ€์ผ์—๋งŒ ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค.
    StyleCop์€ ๋ฒ„๊ทธ, ์„ฑ๋Šฅ ๋ฌธ์ œ ๋˜๋Š” ์ทจ์•ฝ์ ์„ ๊ฐ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Roslyn ๋ถ„์„๊ธฐ๋‚˜ SonarQube์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋ณด์™„ํ•˜์ง€๋งŒ, ์ด๋ฅผ ๋Œ€์ฒดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ง€๋‚˜์น˜๊ฒŒ ์—„๊ฒฉํ•˜๊ณ  ์žฅํ™ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
    StyleCop ๊ทœ์น™์€ ๋‹ค์–‘ํ•˜๊ณ  ์ข…์ข… ์—„๊ฒฉํ•ฉ๋‹ˆ๋‹ค. ์‹ ์ค‘ํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ํŒ€์€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์Šคํƒ€์ผ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ์— ์••๋„๋‹นํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ง‘์ค‘๋ ฅ์„ ํํŠธ๋Ÿฌ๋œจ๋ฆฌ๊ฑฐ๋‚˜ ๊ทœ์น™ ํ”ผ๋กœ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ตœ์‹  C# ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ง€์›์ด ์ œํ•œ๋จ
    StyleCop.Analyzers๋Š” ์ตœ์‹  C# ๋ฒ„์ „(๋ ˆ์ฝ”๋“œ, ํŒจํ„ด ๋งค์นญ, null ๊ฐ€๋Šฅ ์ฐธ์กฐ ์œ ํ˜• ๋“ฑ)๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊ฐœ์„ ํ–ˆ์ง€๋งŒ, ์ง€์›์ด ์ปดํŒŒ์ผ๋Ÿฌ ์—…๋ฐ์ดํŠธ๋ณด๋‹ค ๋Šฆ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด ๋น ๋ฅด๊ฒŒ ๋ฐœ์ „ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋งˆ์ฐฐ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ์  ๋ณด๊ณ ๋‚˜ ์ธก์ •ํ•ญ๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค
    SonarQube๋‚˜ NDepend์™€ ๋‹ฌ๋ฆฌ StyleCop์—๋Š” ๋Œ€์‹œ๋ณด๋“œ, ์ฐจํŠธ ๋˜๋Š” ์ถ”์„ธ ์ถ”์  ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. IDE ๋˜๋Š” ๋นŒ๋“œ ์ถœ๋ ฅ์—๋งŒ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ํŒ€ ์ „์ฒด์˜ ๊ฐ€์‹œ์„ฑ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฑด์ถ•ํ•™์  ๋˜๋Š” ๋ณต์žก์„ฑ ๋ถ„์„ ์—†์Œ
    StyleCop์€ ์ฝ”๋“œ ์ข…์†์„ฑ, ํด๋ž˜์Šค ๊ตฌ์กฐ ๋˜๋Š” ์œ ์ง€ ๊ด€๋ฆฌ ์ธ๋ฑ์Šค๋ฅผ ๋ถ„์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ฌ์ธต์ ์ธ ๋””์ž์ธ ํ’ˆ์งˆ์ด ์•„๋‹Œ ํ‘œ๋ฉด์ ์ธ ์ผ๊ด€์„ฑ์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐฉํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์—์„œ StyleCop์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋นŒ๋“œ์— ๊ฒฝ๊ณ ๊ฐ€ ๋„˜์ณ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์€ ํŠนํžˆ ๋„์ž… ๋‹จ๊ณ„์—์„œ ์‹œํ–‰๊ณผ ์‹ค์šฉ์„ฑ ๊ฐ„์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ๊ทœ์น™์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€์—ญ์‚ฌํšŒ ์œ ์ง€ ๊ด€๋ฆฌ์— ๋”ฐ๋ผ
    ์›๋ž˜ Microsoft ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณด๊ด€๋œ ์ดํ›„, ์ง€์†์ ์ธ ๊ฐœ๋ฐœ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ์—ฌ์ž๋“ค์˜ ๋„์›€์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ™œ๋ฐœํ•˜์ง€๋งŒ ์žฅ๊ธฐ์ ์ธ ์ง€์† ๊ฐ€๋Šฅ์„ฑ์€ ์žฆ์€ ์—…๋ฐ์ดํŠธ์™€ ์ง€์›์— ์˜์กดํ•˜๋Š” ๊ธฐ์—…์—๊ฒŒ๋Š” ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์—ํ”„์—‘์Šค์บ…

FxCop์€ Microsoft์—์„œ ๊ฐœ๋ฐœํ•œ ์ดˆ๊ธฐ ์ •์  ๋ถ„์„ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋กœ, .NET ๊ด€๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ปดํŒŒ์ผ๋œ ์–ด์…ˆ๋ธ”๋ฆฌ(IL ์ฝ”๋“œ)๋ฅผ ๋ถ„์„ํ•˜์—ฌ Microsoft์˜ .NET Framework ๋””์ž์ธ ์ง€์นจ์„ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ FxCop์€ Visual Studio ๋ฐ MSBuild์™€ ํ†ตํ•ฉ๋œ Roslyn ๊ธฐ๋ฐ˜ ๋ถ„์„๊ธฐ ์„ธํŠธ์ธ FxCop Analyzers๋กœ ๋ฐœ์ „ํ•˜์—ฌ ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ C# ๋ฐ VB.NET ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

์›๋ž˜์˜ ๋…๋ฆฝํ˜• FxCop์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ, FxCop ๋ถ„์„๊ธฐ ํŒจํ‚ค์ง€๋Š” ์—ฌ์ „ํžˆ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„ ์ตœ์‹  .NET ๊ฐœ๋ฐœ์˜ ์ผ๋ถ€๋กœ .NET SDK ๋ถ„์„๊ธฐ์— ํก์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  • Microsoft์—์„œ ๊ตฌ์ถ• ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌํ•˜์—ฌ Visual Studio ๋ฐ .NET SDK์™€์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • Roslyn์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ์‹œ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋น ๋ฅด๊ณ  ์‹ค์‹œ๊ฐ„ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ฒ” ์‚ฌ๋ก€, ๋ช…๋ช… ๊ทœ์น™, ์„ฑ๋Šฅ ์ œ์•ˆ ๋ฐ ๋””์ž์ธ ์ง€์นจ ์ค€์ˆ˜๋ฅผ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๊ทœ์น™ ์„ธํŠธ ๋ฐ editorconfig๋ฅผ ํ†ตํ•ด ๊ทœ์น™ ์–ต์ œ ๋ฐ ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • NuGet์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์„ค์น˜ํ•˜๊ณ  ๊ธฐ์กด .NET Core ๋˜๋Š” .NET 5+ ํ”„๋กœ์ ํŠธ์— ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ, ๊ธ€๋กœ๋ฒŒํ™”, ์•ˆ์ •์„ฑ, ์œ ์ง€ ๊ด€๋ฆฌ ๋“ฑ์„ ํฌ๊ด„ํ•˜๋Š” ํ’๋ถ€ํ•œ ๊ทœ์น™ ์„ธํŠธ
  • ์ด์ œ ํ™œ๋ฐœํ•œ ๊ฐœ๋ฐœ์ด ๋‹ค์Œ์œผ๋กœ ์ „ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. .NET ๋ถ„์„๊ธฐ, ๋ฏธ๋ž˜์˜ ์—ฐ์†์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค

ํ•œ๊ณ„์™€ ๋‹จ์ 

FxCop ๋ถ„์„๊ธฐ๋Š” .NET ๋””์ž์ธ ๊ทœ์น™์„ ์ ์šฉํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณด์•ˆ ์ค‘์‹ฌ ๋ถ„์„ ์—†์Œ
    FxCop์€ ์‹ฌ์ธต์ ์ธ ๋ณด์•ˆ ๊ฒฐํ•จ, ํ…Œ์ธํŠธ ์ถ”์ , ๋˜๋Š” XSS๋‚˜ SQL ์ธ์ ์…˜๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์ทจ์•ฝ์ ์„ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋ณด์ฆ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. CodeQL, ๋ฒ ๋ผ์ฝ”๋“œ๋ฐ ํ™•๊ณ ํžˆ ํ•˜๋‹ค ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ œํ•œ๋œ ํ™•์žฅ์„ฑ
    ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™ ์ƒ์„ฑ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ถ„์„ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋น„ํ•ด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์ •์ฑ… ์ ์šฉ์„ ์›ํ•˜๋Š” ๊ธฐ์—…์€ Roslyn Analyzer ๊ฐœ๋ฐœ์ด ๋” ์œ ์—ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋…๋ฆฝํ˜• ๋ฒ„์ „
    ๊ธฐ์กด FxCop GUI ๋ฐ IL ์ˆ˜์ค€ ๋ถ„์„ ๋„๊ตฌ๋Š” ๋” ์ด์ƒ ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์‚ฌ์šฉ์ž๋Š” ๋™์ž‘ ๋ฐฉ์‹๊ณผ ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฅธ Roslyn ๊ธฐ๋ฐ˜ ๋ถ„์„๊ธฐ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์•„ํ‚คํ…์ฒ˜ ๋˜๋Š” ์ข…์†์„ฑ ๋ถ„์„์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
    FxCop์€ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜, ๋ชจ๋“ˆ ์ข…์†์„ฑ ๋˜๋Š” ๊ณ„์ธต์  ์œ„๋ฐ˜์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. NDepend ์ด๋Ÿฐ ๋ฌธ์ œ์—๋Š” ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ์  ๋Œ€์‹œ๋ณด๋“œ ๋˜๋Š” ์ธก์ •ํ•ญ๋ชฉ์ด ๋ถ€์กฑํ•จ
    FxCop์€ ๋ณด๊ณ , ์ถ”์„ธ ์ถ”์  ๋˜๋Š” ํŒ€ ์ „์ฒด ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ UI๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•ด IDE ์ง„๋‹จ์ด๋‚˜ ๋นŒ๋“œ ์ถœ๋ ฅ์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒ€๊ณผ ๊ด€๋ฆฌ์ž์˜ ๊ฐ€์‹œ์„ฑ์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • .NET SDK ๋ถ„์„๊ธฐ์™€ ์ค‘๋ณต
    ์ตœ์‹  .NET ๋ฒ„์ „์—์„œ๋Š” ๋งŽ์€ FxCop ๊ทœ์น™์ด SDK ๋‚ด์žฅ ๋ถ„์„๊ธฐ์— ํ†ตํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทœ์น™ ์„ธํŠธ๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ํ˜ผ๋ž€์ด๋‚˜ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • MSBuild๊ฐ€ ์•„๋‹Œ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ง€์›์ด ๋ถ€์กฑํ•จ
    MSBuild ์ƒํƒœ๊ณ„ ์™ธ๋ถ€์˜ ํ”„๋กœ์ ํŠธ(์˜ˆ: Bazel์ด๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋นŒ๋“œ ์‹œ์Šคํ…œ ์‚ฌ์šฉ)๋Š” FxCop ์Šคํƒ€์ผ ๊ทœ์น™์„ ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์Šต๋‹ˆ๋‹ค.

FxCop(ํ˜„์žฌ Roslyn ๊ธฐ๋ฐ˜)์€ C# ํ”„๋กœ์ ํŠธ, ํŠนํžˆ ํ‘œ์ค€ ์ฝ”๋”ฉ ๋ฐ ๋””์ž์ธ ๊ทœ์น™์„ ์ ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ํŒ€์„ ์œ„ํ•œ Microsoft์—์„œ ์ง€์›ํ•˜๋Š” ๊ฒฌ๊ณ ํ•œ ์ •์  ๋ถ„์„ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์•„ํ‚คํ…์ฒ˜ ๊ฒ€์ฆ, ๋ณด์•ˆ ์Šค์บ๋‹ ๋ฐ ์‹œ๊ฐ์  ๋ณด๊ณ ๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

Fortify ์ •์  ์ฝ”๋“œ ๋ถ„์„๊ธฐ

Fortify SCA๋Š” C#์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๋ณด์•ˆ ์ทจ์•ฝ์ ๊ณผ ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฌธ์ œ๋ฅผ ํƒ์ง€ํ•˜๋„๋ก ์„ค๊ณ„๋œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ •์  ๋ถ„์„ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ, ๊ตฌ์„ฑ ํŒŒ์ผ ๋ฐ ๋นŒ๋“œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ๊ฐœ๋ฐœ ๋ผ์ดํ”„์‚ฌ์ดํด ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ์ž ์žฌ์  ์œ„ํ—˜์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. Fortify๋Š” ์—„๊ฒฉํ•œ ๊ทœ์ • ์ค€์ˆ˜ ๋ฐ ๋ณด์•ˆ ํ‘œ์ค€ ๋•๋ถ„์— ๊ธˆ์œต, ์˜๋ฃŒ, ์ •๋ถ€์™€ ๊ฐ™์ด ๊ทœ์ œ๊ฐ€ ์—„๊ฒฉํ•œ ์‚ฐ์—…์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  • ์ตœ์‹  C# ๋ฐ .NET ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์ „์ฒด ์ ์šฉ์„ ํฌํ•จํ•˜์—ฌ ๊ด‘๋ฒ”์œ„ํ•œ ์–ธ์–ด ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›
  • ์ฃผ์ž… ์ทจ์•ฝ์ , ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์•”ํ˜ธํ™”, ์ธ์ฆ ๋ฌธ์ œ ๋“ฑ์„ ํฌํ•จํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ๋ณด์•ˆ ๊ฒฐํ•จ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • CWE, OWASP Top 10, SANS 25์™€ ๊ฐ™์€ ์‚ฐ์—… ํ‘œ์ค€์„ ์ทจ์•ฝ์„ฑ ๋ถ„๋ฅ˜์— ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • CI/CD ๋„๊ตฌ, IDE(์˜ˆ: Visual Studio) ๋ฐ DevSecOps ํŒŒ์ดํ”„๋ผ์ธ๊ณผ์˜ ํ†ตํ•ฉ ์ง€์›
  • ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ง€์ •๋œ ์ˆ˜์ • ์ง€์นจ์ด ํฌํ•จ๋œ ์ƒ์„ธ ๋ณด๊ณ ์„œ
  • ๊ธฐ์—… ์ˆ˜์ค€์˜ ๊ฑฐ๋ฒ„๋„Œ์Šค, ์ถ”์  ๋ฐ ์œ„ํ—˜ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๋ณด์•ˆ ์„ผํ„ฐ(SSC)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋„๋ฉ”์ธ๋ณ„ ์ •์ฑ…์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™ ํŒฉ ๋ฐ ๊ตฌ์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋žœ ๋ณด์•ˆ ์—ฐ๊ตฌํŒ€๊ณผ ์ •๊ธฐ์ ์ธ ๊ทœ์น™ ํŒฉ ์—…๋ฐ์ดํŠธ๋กœ ์ง€์›๋จ
  • ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋ฐ ๋ ˆ๊ฑฐ์‹œ .NET ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์ง€์›์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

Fortify SCA๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ๋ณต์žก์„ฑ๊ณผ ๊ธฐ์—… ์ค‘์‹ฌ์  ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋†’์€ ํ•™์Šต ๊ณก์„ 
    Fortify์˜ ์„ค์ •, ๊ตฌ์„ฑ ๋ฐ ํŠœ๋‹์€ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํšจ๊ณผ์ ์ธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ „๋‹ด ๋ณด์•ˆ ์—”์ง€๋‹ˆ์–ด๋‚˜ ์ปจ์„คํ„ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์„ฑ๋Šฅ ์˜ํ–ฅ
    ์ „์ฒด ๊ฒ€์‚ฌ๋Š” ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ๋˜๋Š” ๋‹จ์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ๋ถ„ ๊ฒ€์‚ฌ ๋˜๋Š” ๋ถ€๋ถ„ ๊ฒ€์‚ฌ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์„ธ์‹ฌํ•œ ์กฐ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์‹ผ ๋ผ์ด์„ ์Šค
    Fortify๋Š” ์‹œ์ค‘์—์„œ ๊ฐ€์žฅ ๋น„์‹ผ ์†”๋ฃจ์…˜ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ์ค‘์†Œ ๊ทœ๋ชจ ํŒ€์ด ๊ฐ๋‹นํ•˜๊ธฐ์—๋Š” ๊ฐ€๊ฒฉ์ด ๋„ˆ๋ฌด ๋น„์‹ผ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋ผ์ด์„ ์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๊ธฐ์™€ ์‚ฌ์šฉ์ž ์ˆ˜์— ๋”ฐ๋ผ ๊ณ„์ธตํ™”๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๊ฐ€ํŒŒ๋ฅธ ์˜จ๋ณด๋”ฉ
    ๋ณด์•ˆ ๊ฐœ๋…์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ์ž๋Š” Fortify์˜ ์ƒ์„ธ ๋ณด๊ณ ์„œ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ  ํ•ด์„ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IDE์™€์˜ ํ†ตํ•ฉ์€ ๋„์›€์ด ๋˜์ง€๋งŒ, ๊ต์œก ์—†์ด๋Š” ๋งฅ๋ฝ ํŒŒ์•…์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฃฐํŒฉ ํŠœ๋‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
    ๊ธฐ๋ณธ ๊ทœ์น™์€ ๋งŽ์€ ์–‘์˜ ๊ฒฝ๊ณ ๋‚˜ ์˜คํƒ์ง€๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์œผ๋ ค๋ฉด ํ”„๋กœ์ ํŠธ๋ณ„ ์ƒํ™ฉ์— ๋งž์ถฐ ๊ทœ์น™์„ ์กฐ์ •ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํˆฌ์žํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ œํ•œ๋œ ์•„ํ‚คํ…์ฒ˜ ๋˜๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ ํ†ต์ฐฐ๋ ฅ
    Fortify๋Š” ๋ณด์•ˆ ์Šค์บ๋‹์— ํƒ์›”ํ•˜์ง€๋งŒ, ์†Œํ”„ํŠธ์›จ์–ด ์œ ์ง€ ๊ด€๋ฆฌ ์šฉ์ด์„ฑ, ์ฝ”๋“œ ๋ณต์žก์„ฑ ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์ ํ•ฉ์„ฑ์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ์€ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ์ „์ฒด์ ์ธ ๊ด€์ ์„ ์œ„ํ•ด์„œ๋Š” ๋ณด์™„์ ์ธ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ํ†ตํ•ฉ ๊ณผ์ œ ๊ตฌ์ถ•
    ๋น„ํ‘œ์ค€ ๋นŒ๋“œ ํ™˜๊ฒฝ์ด๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒฝ์šฐ Fortify ์Šค์บ”์„ CI/CD ์›Œํฌํ”Œ๋กœ์— ์™„์ „ํžˆ ํ†ตํ•ฉํ•˜๋ ค๋ฉด ์ถ”๊ฐ€์ ์ธ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ฒดํฌ ๋งˆํฌ์Šค

Checkmarx๋Š” ๊ธฐ์—…์ด ๊ฐœ๋ฐœ ๋ผ์ดํ”„์‚ฌ์ดํด ์ดˆ๊ธฐ์— ์†Œ์Šค ์ฝ”๋“œ์˜ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ํŒŒ์•…ํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ์„ ๋„์ ์ธ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ SAST ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ASP.NET, Blazor ๋ฐ ๋ ˆ๊ฑฐ์‹œ .NET Framework ์•ฑ์„ ํฌํ•จํ•˜์—ฌ C# ๋ฐ .NET ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์‹ฌ์ธต ๋ถ„์„ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  DevSecOps ์›Œํฌํ”Œ๋กœ์— ํ†ตํ•ฉ๋˜๋„๋ก ์„ค๊ณ„๋œ Checkmarx๋Š” ๊ธˆ์œต, ์˜๋ฃŒ, ๊ตญ๋ฐฉ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  • ์ „์ฒด ๊ตฌ๋ฌธ, ์˜๋ฏธ ๋ฐ ํ๋ฆ„ ๋ถ„์„์„ ํฌํ•จํ•œ C# ๋ฐ .NET ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ์ง€์›
  • SQL ์ฃผ์ž…, ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…, ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋น„๋ฐ€, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์—ญ์ง๋ ฌํ™” ๋ฐ ์ธ์ฆ ๊ฒฐํ•จ๊ณผ ๊ฐ™์€ ์ทจ์•ฝ์ ์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒํ™ฉ์— ๋งž๋Š” ์ทจ์•ฝ์„ฑ ์ถ”์ ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐ ์ œ์–ด ํ๋ฆ„ ๋ชจ๋ธ๋ง์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Visual Studio, Azure DevOps, GitHub, GitLab, Jenkins ๋“ฑ๊ณผ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ์Šค์บ๋‹ ์ •์ฑ… ๋ฐ ๊ทœ์ • ์ค€์ˆ˜ ๋งคํ•‘(์˜ˆ: OWASP Top 10, PCI DSS, HIPAA, GDPR)
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌธ์ œ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์ˆ˜์ • ์ง€์นจ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ„ํ—˜ ๊ด€๋ฆฌ, ๊ทœ์ • ์ค€์ˆ˜ ๋ฐ ๊ฐ์‚ฌ ์ค€๋น„๋ฅผ ์œ„ํ•œ ์ค‘์•™ ์ง‘์ค‘์‹ ๋Œ€์‹œ๋ณด๋“œ ๋ฐ ๋ณด๊ณ 
  • ๊ด€๋ฆฌํ˜• ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ์Šค์บ๋‹ ์„œ๋น„์Šค(Checkmarx One)์™€ ์˜จํ”„๋ ˆ๋ฏธ์Šค ๋ฐฐํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • SCA(์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ ๋ถ„์„) ๋ฐ IaC(์ฝ”๋“œ๋กœ์„œ์˜ ์ธํ”„๋ผ) ๋„๊ตฌ์™€์˜ ํ†ตํ•ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

Checkmarx๋Š” ๊ธฐ์—…์— ์ ํ•ฉํ•œ ๊ฐ•์ ์ด ์žˆ์ง€๋งŒ, C#์„ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์— ํŠนํžˆ ์ค‘์š”ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•˜๊ณ  ๋ณต์žกํ•œ ์„ค์ •
    ๊ทœ์น™ ์กฐ์ • ๋ฐ CI ํ†ตํ•ฉ์„ ํฌํ•จํ•œ ์ดˆ๊ธฐ ๊ตฌ์„ฑ์—๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํšจ๊ณผ์ ์ธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” ์˜จ๋ณด๋”ฉ ์ง€์›์ด๋‚˜ ๊ณต๊ธ‰์—…์ฒด์˜ ์ง€์›์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ๋ ˆ๊ฑฐ์‹œ C# ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฑฐ์ง“ ๊ธ์ •
    ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ๋น„ํ‘œ์ค€ ์ฝ”๋“œ ํŒจํ„ด(์˜ˆ: ๋™์  ๋ฐ˜์‚ฌ ๋˜๋Š” ADO.NET)์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒ€์‚ฌ ๊ทœ์น™์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฑฐ์ง“ ์–‘์„ฑ๋ฅ ์ด ๋†’์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ œํ•œ๋œ ์•„ํ‚คํ…์ฒ˜/์ฝ”๋“œ ํ’ˆ์งˆ ์ธก์ • ํ•ญ๋ชฉ
    Checkmarx๋Š” ๋ณด์•ˆ ์ทจ์•ฝ์  ํƒ์ง€์— ํƒ์›”ํ•˜์ง€๋งŒ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๋ชจ๋“ˆ์„ฑ, ๋˜๋Š” ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜ ์›์น™ ์ค€์ˆ˜์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์€ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. NDepend๋‚˜ ReSharper์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” ํ’ˆ์งˆ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋†’์€ ๋น„์šฉ๊ณผ ๊ธฐ์—… ์ค‘์‹ฌ
    ๋ผ์ด์„ ์Šค ๋น„์šฉ์ด ์ƒ๋‹นํ•˜๋ฉฐ ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ์Šคํƒ€ํŠธ์—…์—๋Š” ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”Œ๋žซํผ์€ ์ฃผ๋กœ ๋Œ€๊ทœ๋ชจ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ๋ณด์•ˆ์„ ์ค‘์‹œํ•˜๋Š” ๊ธฐ์—…์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ C# ํ”„๋กœ์ ํŠธ์˜ ์Šค์บ” ๊ธฐ๊ฐ„
    ์‹ฌ์ธต ์Šค์บ” ์ •ํ™•๋„๋Š” ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ๋ชจ๋†€๋ฆฌ์‹ ๋˜๋Š” ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ตœ์ ํ™” ์—†์ด ์Šค์บ”์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ํŒŒ์ดํ”„๋ผ์ธ ์†๋„๊ฐ€ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ถ€ .NET ๊ด€๋ จ ์›Œํฌํ”Œ๋กœ์™€์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ์ด ์—†์Šต๋‹ˆ๋‹ค.
    Microsoft ๊ธฐ๋ณธ ๋„๊ตฌ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋ถ„์„๊ธฐ, null ๊ฐ€๋Šฅ ์ฐธ์กฐ ์œ ํ˜• ๋˜๋Š” ๋Ÿฐํƒ€์ž„๋ณ„ ๊ตฌ์„ฑ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ๊ณผ์˜ ํ†ตํ•ฉ์ด ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ•™์Šต ๊ณก์„ 
    ๋ณด์•ˆ ์ฝ”๋”ฉ์ด๋‚˜ ๊ณ ๊ธ‰ ์ทจ์•ฝ์  ์œ ํ˜•์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ์ž๋Š” ์ง€์นจ์ด๋‚˜ ๊ต์œก ์—†์ด ๋ณด๊ณ ์„œ ์ถœ๋ ฅ์„ ํ•ด์„ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Checkmarx๋Š” ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ฐ•๋ ฅํ•˜๊ณ  ์ž๋™ํ™”๋œ ์ทจ์•ฝ์  ํƒ์ง€๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ .NET/C# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊นŠ์ด์™€ ์ œ์–ด ์ธก๋ฉด์—์„œ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๊ฐ€๋ฒผ์šด ์ฝ”๋“œ ๋˜๋Š” ์‹ค์‹œ๊ฐ„ ์ •์  ์ฝ”๋“œ ํ”ผ๋“œ๋ฐฑ์ด ํ•„์š”ํ•œ ํŒ€์—๊ฒŒ๋Š” ๊ณผ๋„ํ•˜๊ฑฐ๋‚˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์ด ๋„ˆ๋ฌด ๋งŽ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Veracode ์ •์  ๋ถ„์„

Veracode๋Š” ๊ฐ„ํŽธํ•œ ์˜จ๋ณด๋”ฉ ๋ฐ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ฑฐ๋ฒ„๋„Œ์Šค๋กœ ์œ ๋ช…ํ•œ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์ •์  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ํ…Œ์ŠคํŠธ(SAST) ํ”Œ๋žซํผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์€ํ–‰, ์˜๋ฃŒ, ๋ณดํ—˜ ๋“ฑ ์—„๊ฒฉํ•œ ๊ทœ์ • ์ค€์ˆ˜ ์˜๋ฌด๊ฐ€ ์žˆ๋Š” ์‚ฐ์—…์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. C# ๊ฐœ๋ฐœ์ž์™€ .NET ํŒ€์„ ์œ„ํ•ด Veracode๋Š” ASP.NET Core, Blazor ๋ฐ ๋ ˆ๊ฑฐ์‹œ .NET Framework ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํ•จํ•œ ์›น ๋ฐ ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ„์„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  • .NET Core ๋ฐ .NET 6+๋ฅผ ํฌํ•จํ•œ ์ตœ์‹  ๋ฐ ๋ ˆ๊ฑฐ์‹œ C# ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ „์ฒด ์ง€์›
  • ์ฃผ์ž…, ์•”ํ˜ธํ™” ๊ฒฐํ•จ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ API ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ฌธ์ œ๋ฅผ ํฌํ•จํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ์ทจ์•ฝ์ ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์™„์ „ํ•œ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋กœ ์ธํ•ด ๋กœ์ปฌ ์ธํ”„๋ผ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ(DLL, EXE ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ ์—…๋กœ๋“œ ๋ฐ ์Šค์บ” ๋ชจ๋ธ
  • OWASP Top 10, CWE, SANS 25 ๋ฐ ์—…๊ณ„๋ณ„ ๊ทœ์ •์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ์ฝ”๋”ฉ ๊ด€ํ–‰์˜ ์ž๋™ ์ ์šฉ์„ ํ†ตํ•ด ์ •์ฑ… ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • Visual Studio, Azure DevOps, Jenkins, GitHub, GitLab ๋ฐ ๊ธฐํƒ€ CI/CD ํ”Œ๋žซํผ๊ณผ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ช…ํ™•ํ•œ ์ˆ˜์ • ์ง€์นจ, CWE ๋งํฌ ๋ฐ ์ˆ˜์ • ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทœ์ • ์ค€์ˆ˜ ๋ฐ ๊ฐ์‚ฌ ์ถ”์ ์„ ์œ„ํ•œ ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ์™€ ์ค‘์•™ ์ง‘์ค‘์‹ ์œ„ํ—˜ ๋ณด๊ณ ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ์—ฐ๊ตฌ ๋ฐ ์ •๊ธฐ์ ์ธ ๊ทœ์น™ ํŒฉ ์—…๋ฐ์ดํŠธ ์ง€์›

ํ•œ๊ณ„์™€ ๋‹จ์ 

Veracode๋Š” C#์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ๋ถ„์„์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ตฌ์กฐ์ , ์‹ค์šฉ์  ์ธก๋ฉด์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์Šค์บ๋‹์€ ์†Œ์Šค ์ˆ˜์ค€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
    Veracode๋Š” ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์—์„œ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ, ์ฝ”๋“œ ์ฃผ์„, ์„ธ๋ถ„ํ™”๋œ ์ œ์–ด ํ๋ฆ„ ์กฐ๊ฑด ๋“ฑ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์•ฑ์„ ์—…๋กœ๋“œํ•˜๊ธฐ ์ „์— ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ค์‹œ๊ฐ„ IDE ๊ธฐ๋ฐ˜ ํ”ผ๋“œ๋ฐฑ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    Roslyn Analyzers๋‚˜ ReSharper์™€ ๊ฐ™์€ ๋„๊ตฌ์™€ ๋‹ฌ๋ฆฌ Veracode๋Š” ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ธ๋ผ์ธ ๋˜๋Š” ๋Œ€ํ™”ํ˜• ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ทจ์•ฝ์ ์€ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋นŒ๋“œ๋˜๊ณ  ์—…๋กœ๋“œ๋œ ํ›„์—๋งŒ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.
  • CI/CD์˜ ๋А๋ฆฐ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„
    ์—ฌ๋Ÿฌ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํ†ตํ•ฉ๋˜์–ด ์žˆ์ง€๋งŒ, ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ณผ์ •์€ ๋น ๋ฅธ ๋ฐ˜๋ณต ์ž‘์—…์ด๋‚˜ ํ…Œ์ŠคํŠธ ์ค‘์‹ฌ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠœ๋‹ ์—†์ด ์ด‰๋ฐ•ํ•œ ๊ฐœ๋ฐœ ์ฃผ๊ธฐ๋ฅผ ์†Œํ™”ํ•ด์•ผ ํ•˜๋Š” ํ™˜๊ฒฝ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ œํ•œ๋œ ์ •์  ์ฝ”๋“œ ํ’ˆ์งˆ ๋˜๋Š” ์Šคํƒ€์ผ ์ ์šฉ
    Veracode๋Š” ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ, ์•„ํ‚คํ…์ฒ˜ ๊ฒ€์ฆ ๋˜๋Š” ์„œ์‹๋ณด๋‹ค๋Š” ๋ณด์•ˆ ๊ฒฐํ•จ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ํŒ€์€ ์ „์ฒด ๋ฒ”์œ„๋ฅผ ํฌ๊ด„ํ•˜๊ธฐ ์œ„ํ•ด StyleCop, NDepend ๋˜๋Š” ESLint์™€ ๊ฐ™์€ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ์—… ์ˆ˜์ค€ ๊ฐ€๊ฒฉ ์ฑ…์ •
    ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋น„์šฉ์ด ๋ถ€๋‹ด์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”Œ๋žซํผ์€ ๋ณด์•ˆ ์ค‘์‹ฌ ๊ฐœ๋ฐœ์„ ์ง€์›ํ•  ์˜ˆ์‚ฐ๊ณผ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ–์ถ˜ ์ค‘๊ฒฌ ๋ฐ ๋Œ€๊ธฐ์—…์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทœ์น™ ์‚ฌ์šฉ์ž ์ •์˜ ๋ถ€์กฑ
    ์˜คํ”ˆ ์†Œ์Šค๋‚˜ ๋กœ์ปฌ ํ˜ธ์ŠคํŒ… ๋„๊ตฌ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ, Veracode๋Š” ๋…์ ์ ์ธ ์ฝ”๋”ฉ ํŒจํ„ด์ด๋‚˜ ํ‹ˆ์ƒˆ C# API์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ํƒ์ง€ ๊ทœ์น™์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

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

ํด๋ก์›Œํฌ

Perforce์—์„œ ๊ฐœ๋ฐœํ•œ Klocwork๋Š” ๊ณ ์‹ ๋ขฐ๋„ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ์ •์  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ํ…Œ์ŠคํŠธ(SAST) ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. C#, C++, Java, Python, JavaScript ๋“ฑ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ์ž๋™์ฐจ, ํ•ญ๊ณต์šฐ์ฃผ, ๋ฐฉ์œ„, ์˜๋ฃŒ ๋“ฑ ๊ทœ์ œ๊ฐ€ ์—„๊ฒฉํ•˜๊ณ  ์•ˆ์ „์ด ์ค‘์š”ํ•œ ์‚ฐ์—…์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

C# ํŒ€์˜ ๊ฒฝ์šฐ, Klocwork๋Š” ๊ฐœ๋ฐœ ์ฃผ๊ธฐ ์ดˆ๊ธฐ์— ๋ณด์•ˆ ์ทจ์•ฝ์ , ์ฝ”๋“œ ๊ฒฐํ•จ, ์œ ์ง€ ๊ด€๋ฆฌ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  • ์ตœ์‹  C# ํ‘œ์ค€๊ณผ Visual Studio ๋ฐ MSBuild์™€์˜ ํ†ตํ•ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ, null ์ฐธ์กฐ ์˜ˆ์™ธ, ์ฃผ์ž… ์ทจ์•ฝ์ , ๋™์‹œ์„ฑ ๋ฌธ์ œ ๋ฐ ๋…ผ๋ฆฌ ๊ฒฐํ•จ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ•ํ•œ ์ง‘์ค‘ ๋ณด์•ˆ ์ค€์ˆ˜OWASP Top 10, CWE, MISRA ๋ฐ CERT ํ‘œ์ค€์— ๋Œ€ํ•œ ๋‚ด์žฅ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ๊ณต ์ฆ๋ถ„ ๋ถ„์„ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์ ์‹œ์— ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์—ฌ ํšŒ๊ท€๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด ๋Œ€๊ทœ๋ชจ ๋ณต์žกํ•œ C# ์ฝ”๋“œ๋ฒ ์ด์Šค์™€ ํ˜ธํ™˜ ๊ฐ€๋Šฅ
  • Jenkins, GitHub Actions, Azure DevOps ๋“ฑ์„ ํฌํ•จํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ œ๊ณต ๊ฒฐํ•จ ํ๋ฆ„์˜ ์ถ”์ ์„ฑ ๊ทผ๋ณธ ์›์ธ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ์‹ฌ์ธต ์ง„๋‹จ
  • ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๋ฐ์Šคํฌํ†ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๊ด€๋ฆฌ์ž ๋ฐ QA๋ฅผ ์œ„ํ•œ ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ๋ณด๊ณ  ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋†€๋ฆฌ์‹ ๋˜๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ ์ž‘์—…ํ•˜๋Š” ๋ถ„์‚ฐ ํŒ€์— ํ™•์žฅ ๊ฐ€๋Šฅ
  • DevSecOps ๋ฐ Agile ์„ค์ •์—์„œ ๋ณด์•ˆ ์ค‘์‹ฌ ๊ฐœ๋ฐœ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

Klocwork๋Š” ๊ธฐ์—…์— ๋ฐ”๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ํŠนํžˆ ๊ทœ๋ชจ๊ฐ€ ์ž‘๊ฑฐ๋‚˜ ๊ทœ์ œ๊ฐ€ ๋œํ•œ ๊ฐœ๋ฐœ ํŒ€์˜ ๊ฒฝ์šฐ ๋„์ž…์ด๋‚˜ ์‚ฌ์šฉ์„ฑ์„ ์ €ํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ณผ์ œ์™€ ์˜์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณต์žกํ•œ ๊ตฌ์„ฑ๊ณผ ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ 
    ๋ถ„์„ ๊ทœ์น™์˜ ์ดˆ๊ธฐ ์„ค์ • ๋ฐ ์„ธ๋ถ€ ์กฐ์ •์—๋Š” ์ƒ๋‹นํ•œ ์‹œ๊ฐ„๊ณผ ๋„๋ฉ”์ธ ์ง€์‹์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒ€์€ ๊ต์œก์— ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ฑฐ๋‚˜ ์ „๋‹ด ๋ณด์•ˆ ์—”์ง€๋‹ˆ์–ด๋ฅผ ํˆฌ์ž…ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€๋ฒผ์šด ๋ถ„์„๊ธฐ์— ๋น„ํ•ด ๋” ๋ฌด๊ฑฐ์šด ์„ค์น˜ ๊ณต๊ฐ„
    Klocwork๋Š” Roslyn์ด๋‚˜ StyleCop๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๋„๊ตฌ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜๋ฏ€๋กœ ์‚ฌ์–‘์ด ๋‚ฎ์€ ์ปดํ“จํ„ฐ์—์„œ๋Š” CI ํŒŒ์ดํ”„๋ผ์ธ์ด๋‚˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ด์ง€ ์•Š์Œ
    ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๋Š” ์ตœ์‹  IDE ํ†ตํ•ฉ ๋„๊ตฌ์— ๋น„ํ•ด UX๊ฐ€ ์ง๊ด€์ ์ด์ง€ ์•Š๋‹ค๊ณ  ๋А๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ฒฐ๊ณผ๋ฅผ ํ•ด์„ํ•˜๋ ค๋ฉด ์ˆ™๋ จ๋œ ์ „๋ฌธ๊ฐ€์˜ ์ „๋ฌธ ์ง€์‹์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋†’์€ ๋น„์šฉ๊ณผ ๊ธฐ์—… ํฌ์ง€์…”๋‹
    ๋ผ์ด์„ ์Šค๋Š” ์ค‘๋Œ€ํ˜• ์กฐ์ง์„ ๋Œ€์ƒ์œผ๋กœ ๊ฐ€๊ฒฉ์ด ์ฑ…์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ œํ•œ๋œ ์˜คํ”ˆ์†Œ์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ™•์žฅ์„ฑ
    ์ปค๋ฎค๋‹ˆํ‹ฐ ์ƒํƒœ๊ณ„(์˜ˆ: ESLint, Roslyn)์— ์˜ํ•ด ์ง€์›๋˜๋Š” ๋ถ„์„๊ธฐ์™€ ๋‹ฌ๋ฆฌ Klocwork๋Š” ๋…์ ์ ์ด์–ด์„œ ๊ณต๊ธ‰์—…์ฒด์˜ ์ง€์› ์—†์ด ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์žˆ์–ด ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.
  • UI ๋ฐ ๋ณด๊ณ ์„œ ๊ฒฝํ—˜
    ๋ฌธ์ œ ๋ณด๊ณ  ๋ฐ ๋ถ„๋ฅ˜๋ฅผ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ๋Šฅ์ ์ด์ง€๋งŒ ๊ตฌ์‹์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ํŒ€์€ ๋งŽ์€ ์ˆ˜์˜ ๋ฐœ๊ฒฌ ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ์„ฑ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

Klocwork๋Š” ๊ทœ์ • ์ค€์ˆ˜, ์•ˆ์ „ํ•œ ์ฝ”๋“œ, ๊ทธ๋ฆฌ๊ณ  ๊ณต์‹์ ์ธ ๊ฒฐํ•จ ์ถ”์ ์„ ์š”๊ตฌํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋˜๋Š” ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌ C# ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋น ๋ฅด๊ณ  ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ํ”ผ๋“œ๋ฐฑ๊ณผ ์œ ์—ฐํ•œ ํˆด์„ ์›ํ•˜๋Š” ์†Œ๊ทœ๋ชจ ์• ์ž์ผ ํŒ€์ด๋‚˜ ์กฐ์ง์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์…ˆ๊ทธ๋ ™

Semgrep์€ r2c(ReturnToCorp)์—์„œ ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค ์ •์  ๋ถ„์„ ๋„๊ตฌ๋กœ, C#์„ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ์–ธ์–ด์—์„œ ๊ฐ„ํŽธํ•จ, ์†๋„, ๊ทธ๋ฆฌ๊ณ  ๊ทœ์น™ ๊ธฐ๋ฐ˜ ์Šค์บ๋‹์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋ณด์•ˆ ์—”์ง€๋‹ˆ์–ด์™€ DevSecOps ํŒ€์—์„œ ํŒจํ„ด ๋งค์นญ ๊ธฐ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ๊ทœ์น™์„ ํ†ตํ•ด ๋ณด์•ˆ ๋ฌธ์ œ์™€ ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํฌ์ฐฉํ•˜๋Š” ๊ธฐ๋Šฅ ๋•๋ถ„์— ์ธ๊ธฐ๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค.

Semgrep์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์ƒ์—… ๊ณ„์ธต ๋ชจ๋‘์—์„œ C#์„ ์ง€์›ํ•˜๋ฉฐ ํด๋ผ์šฐ๋“œ ๋ฐ ์…€ํ”„ ํ˜ธ์ŠคํŒ… ๋ฐฐํฌ ๋ชจ๋ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  • ์ตœ์‹  C# ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜๋Š” ๊ฐ€๋ณ๊ณ  ๋น ๋ฅธ CLI ๊ธฐ๋ฐ˜ ๋ถ„์„๊ธฐ
  • ์ž‘์„ฑ ๋ฐ ์ดํ•ด๊ฐ€ ์‰ฌ์šด YAML ๊ธฐ๋ฐ˜ ๊ทœ์น™์„ ํ†ตํ•ด ์กฐ์ง์˜ ์ฝ”๋”ฉ ๊ด€ํ–‰์— ๋งž๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํŒจํ„ด์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋น ๋ฅธ ์‹คํ–‰ ๋ฐ GitHub Actions, GitLab CI, Azure DevOps ๋“ฑ๊ณผ์˜ CI/CD ํ†ตํ•ฉ์œผ๋กœ DevSecOps ํŒŒ์ดํ”„๋ผ์ธ์— ์ ํ•ฉ
  • ๋ณด์•ˆ, ์œ ์ง€ ๊ด€๋ฆฌ ๋ฐ ์„ฑ๋Šฅ์„ ์œ„ํ•œ ๋‚ด์žฅ ๊ทœ์น™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(OWASP Top 10, SANS 25 ๋“ฑ ํฌํ•จ)
  • ๋ณ‘ํ•ฉ ๋˜๋Š” ๋ฐฐํฌ ์ „์— ๋ฌธ์ œ๋ฅผ ํฌ์ฐฉํ•˜์—ฌ ๋ณด์•ˆ์„ ์™ผ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐ ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ง€์›
  • ๊ณต์œ  ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „๋ฐ˜์— ๊ฑธ์ณ ๋ณด์•ˆ ํŒจํ„ด๊ณผ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
  • ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ(Semgrep Cloud Platform)์—๋Š” ๋Œ€์‹œ๋ณด๋“œ, PR ์ฝ”๋ฉ˜ํŒ…, ๊ฐ์‚ฌ ๋กœ๊ทธ ๋ฐ ํŒ€ ๊ธฐ๋ฐ˜ ๊ทœ์น™ ์‹œํ–‰์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • Semgrep Supply Chain ๋ฐ Semgrep Secrets๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋”์šฑ ์‹ฌ์ธต์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ์ ์šฉ ๋ฒ”์œ„ ํ™•์žฅ ๊ฐ€๋Šฅ
  • ํ™œ๊ธฐ์ฐฌ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๋Š์ž„์—†์ด ์„ฑ์žฅํ•˜๋Š” ์˜คํ”ˆ ๊ทœ์น™ ๋“ฑ๋ก๋ถ€
  • ์†Œ๊ทœ๋ชจ ํŒ€์„ ์œ„ํ•œ ๋„‰๋„‰ํ•œ ํ•œ๋„์™€ ์ง„์ž… ์žฅ๋ฒฝ ์—†๋Š” ๋ฌด๋ฃŒ ๊ณ„์ธต ์ œ๊ณต

ํ•œ๊ณ„์™€ ๋‹จ์ 

Semgrep์€ ์œ ์—ฐ์„ฑ๊ณผ ์†๋„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  C# ์ฝ”๋“œ์— ์ ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ๋‹นํ•œ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์‹ฌ์ธต์ ์ธ ์ •์  ๋ถ„์„ ์ž‘์—…์˜ ๊ฒฝ์šฐ ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

  • C#์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ ์ธ ์–ธ์–ด ์ง€์›
    JavaScript, Python, Go์— ๋Œ€ํ•œ ์„ฑ์ˆ™ํ•œ ์ง€์›์— ๋น„ํ•ด Semgrep์˜ C# ์ง€์›์€ ์•„์ง ๊ฐœ๋ฐœ ๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค. LINQ, async/await ํ๋ฆ„, ์ œ๋„ค๋ฆญ, ๋ณต์žกํ•œ ํ‘œํ˜„์‹ ํŠธ๋ฆฌ์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ C# ๊ธฐ๋Šฅ์„ ์™„์ „ํžˆ ํŒŒ์‹ฑํ•˜๊ฑฐ๋‚˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹ฌ์ธต์ ์ธ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ถ„์„ ์—†์Œ
    Semgrep์€ ๊ตฌ๋ฌธ ๋ฐ ์˜๋ฏธ ๋งค์นญ์— ํƒ์›”ํ•˜์ง€๋งŒ Coverity, Klocwork, CodeQL๊ณผ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ณ ๊ธ‰ ์ œ์–ด ํ๋ฆ„ ๋ฐ ์˜ค์—ผ ๋ถ„์„ ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์—ฌ๋Ÿฌ ํŒŒ์ผ์ด๋‚˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๊ฑธ์ณ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์„ ํƒ์ง€ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ œํ•œ๋œ IDE ํ†ตํ•ฉ
    Roslyn ๊ธฐ๋ฐ˜ ๋ถ„์„๊ธฐ๋‚˜ ReSharper์™€ ๋‹ฌ๋ฆฌ Semgrep์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Visual Studio ๋˜๋Š” Rider ๋‚ด๋ถ€์—์„œ ์ธ๋ผ์ธ ์ง„๋‹จ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํ†ตํ•ฉ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ํ•œ CI ํ”ผ๋“œ๋ฐฑ์— ์˜์กดํ•˜๊ฑฐ๋‚˜ ์ˆ˜๋™ ๊ฒ€์‚ฌ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐํ™”๋‚˜ ์•„ํ‚คํ…์ฒ˜ ๋ถ„์„์ด ์—†์Šต๋‹ˆ๋‹ค
    ๊ธฐ์—… ํŒ€์— ์ž์ฃผ ํ•„์š”ํ•œ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„, ์ฝ”๋“œ ๋ฉ”ํŠธ๋ฆญ ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฒ€์ฆ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ทœ์น™ ์ƒ์„ฑ์„ ์œ„ํ•œ ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ 
    ๊ธฐ๋ณธ ๊ทœ์น™์€ ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ๋Œ€๊ทœ๋ชจ C# ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์•ˆ์ •์ ์ด๊ณ  ๋…ธ์ด์ฆˆ ์—†๋Š” ํŒจํ„ด์„ ๋งŒ๋“ค๋ ค๋ฉด Semgrep์˜ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ ๊ตฌ์กฐ์™€ ์–ธ์–ด ๋‚ด๋ถ€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ง€์‹์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ํ’ˆ์งˆ ์‹œํ–‰๋ณด๋‹ค ๋ณด์•ˆ ์›Œํฌํ”Œ๋กœ์—์„œ ๋” ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
    Semgrep์˜ ๊ฐ•์ ์€ ๋ณด์•ˆ ์Šค์บ๋‹๊ณผ ์ •์ฑ… ์ค€์ˆ˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ€์ผ ๊ทœ์น™ ์ ์šฉ์ด๋‚˜ ์ˆœํ™˜ ๋ณต์žก๋„ ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ์€ NDepend๋‚˜ StyleCop๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋งŒํผ ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Semgrep์€ DevSecOps ๋ฐฉ์‹์„ ๋„์ž…ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•˜๊ณ  ๋น ๋ฅด๋ฉฐ ํ˜‘์—…์ ์ธ ์Šค์บ๋‹์„ ํ•„์š”๋กœ ํ•˜๋Š” ํ˜„๋Œ€ ํŒ€์—๊ฒŒ ํƒ์›”ํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค. C# ๊ฐœ๋ฐœ์˜ ๊ฒฝ์šฐ, ์‹ฌ์ธต ๋ถ„์„๊ธฐ๋‚˜ IDE ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์„ ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋‹ค์ค‘ ๋„๊ตฌ ์ „๋žต์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

CodeQL

GitHub(ํ˜„์žฌ Microsoft์˜ ์ผ๋ถ€)์—์„œ ๊ฐœ๋ฐœํ•œ CodeQL์€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋งˆ์น˜ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์˜๋ฏธ๋ก ์  ์ฝ”๋“œ ๋ถ„์„ ์—”์ง„์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด์•ˆ ์ทจ์•ฝ์ , ์„ฑ๋Šฅ ๋ฌธ์ œ ๋ฐ ์ฝ”๋”ฉ ๊ฒฐํ•จ์„ ํƒ์ง€ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. GitHub Advanced Security(GHAS)์˜ ์ผ๋ถ€์ธ CodeQL์€ ํŠนํžˆ ์˜คํ”ˆ ์†Œ์Šค์˜ ๋Œ€๊ทœ๋ชจ ์ทจ์•ฝ์  ํƒ์ง€์—์„œ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

C#์€ ๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜๋Š” ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, GitHub์—์„œ๋Š” .NET ๊ธฐ๋ฐ˜ ์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ์ง€์›์„ ํ™•๋Œ€ํ•ด ์™”์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  • ์‚ฌ์šฉํ•จ ์‹ฌ์ธต์  ์˜๋ฏธ ๋ถ„์„ C# ์ฝ”๋“œ, ๋ชจ๋ธ๋ง ์ œ์–ด ๋ฐ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํ†ตํ•ด ๋ณต์žกํ•˜๊ณ  ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋œ ์ทจ์•ฝ์„ฑ์„ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • GitHub ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ ํ’€ ์š”์ฒญ, ํ‘ธ์‹œ ์ด๋ฒคํŠธ ๋ฐ ์˜ˆ์•ฝ๋œ ๋ณด์•ˆ ๊ฒ€์‚ฌ์— ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์—ญ์ง๋ ฌํ™”, ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ์ž…๋ ฅ, ๊ฒฝ๋กœ ํƒ์ƒ‰ ๋ฐ ์ฃผ์ž… ํŒจํ„ด๊ณผ ๊ฐ™์€ ์ฐพ๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • GitHub์˜ ์„ฑ์žฅ์— ํž˜์ž…์–ด ์ฟผ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌOWASP Top 10 ๋ฐ CWE์— ๋งž์ถฐ์ง„ ๊ทœ์น™์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • Datalog ๊ธฐ๋ฐ˜์˜ ํŠน์ˆ˜ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ CodeQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋Œ€ํ•œ ์ „์ฒด ์ œ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ•๋ ฅํ•œ ๋ฒ„์ „ ์ œ์–ด ์ธ์‹, ๋ธŒ๋žœ์น˜ ๋ฐ PR ์ „์ฒด์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ถ”์  ๊ฐ€๋Šฅ
  • GitHub Actions ๊ธฐ๋ฐ˜ ํ™•์žฅ ๋•๋ถ„์— ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฐ ๋‹ค์ค‘ ๋ฆฌํฌ ์กฐ์ง์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์˜คํ”ˆ ์†Œ์Šค ์ฟผ๋ฆฌ ํŒฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ฐœ๋ฐœํ•œ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ์—ฐ๊ตฌ์›์„ ์œ„ํ•œ ๊ณผ๊ฑฐ ์ฝ”๋“œ ๊ฒ€ํ†  ๋ฐ ์ทจ์•ฝ์„ฑ ๊ฐ์‚ฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • GitHub ๋ณด์•ˆ ํŒ€์€ ๊ธ€๋กœ๋ฒŒ CVE ์‚ฌ๋ƒฅ์„ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ CodeQL์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ํ–ฅ๋ ฅ์ด ํฐ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์‹ค์ „ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

CodeQL์€ ์‹ฌ์ธต์ ์ธ ์ •์  ๋ถ„์„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ผ์ƒ์ ์ธ ๊ฐœ๋ฐœ์—์„œ C#์— ์ ์šฉํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ฃผ์˜ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™์— ๋Œ€ํ•œ ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ 
    ์‚ฌ์šฉ์ž ์ง€์ • ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด ๊ณ ์œ ํ•œ ๊ตฌ๋ฌธ๊ณผ ์˜๋ฏธ ๋ชจ๋ธ์„ ๊ฐ€์ง„ CodeQL ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ์ง€์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋Š” ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ „๋‹ด ๊ต์œก์ด๋‚˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฑด์ถ•๋ฒ•๊ทœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
    ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” CI ํŒŒ์ดํ”„๋ผ์ธ, ํŠนํžˆ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์ €์žฅ์†Œ์˜ ๊ฒฝ์šฐ ๋ณต์žก์„ฑ๊ณผ ์‹œ๊ฐ„์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์†Œ์Šค ์–ธ์–ด ๋ฒ”์œ„ ๋ฐ ๋„๊ตฌ์— ์˜ํ•ด ์ œํ•œ๋จ
    C#์€ ์ง€์›๋˜์ง€๋งŒ, Java, JavaScript, Python๊ณผ ๊ฐ™์€ CodeQL์˜ ์ฃผ์š” ์–ธ์–ด๋ณด๋‹ค ์‚ฌ์ „ ๋นŒ๋“œ๋œ ๊ทœ์น™ ๋ฐ ์ฟผ๋ฆฌ ํ’ˆ์งˆ ์ธก๋ฉด์—์„œ ๋’ค์ฒ˜์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ผ๋ถ€ ๊ณ ๊ธ‰ .NET ๊ด€๋ จ ๋™์ž‘(์˜ˆ: ๋ฆฌํ”Œ๋ ‰์…˜, ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ์ƒ์„ฑ)์€ ๋ชจ๋ธ๋งํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์Šคํƒ€์ผ ๋˜๋Š” ์„œ์‹ ๊ทœ์น™์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    CodeQL์€ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋‚˜ ์ฝ”๋“œ ํ˜•์‹์„ ๊ฐ•์ œํ•˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ์ , ์˜๋ฏธ์ , ๋ณด์•ˆ ๊ธฐ๋ฐ˜ ํŒจํ„ด์— ์—„๊ฒฉํ•˜๊ฒŒ ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค.
  • IDE ์ง€์› ๋ถ€์กฑ
    Visual Studio๋‚˜ Rider์™€ ์ง์ ‘ ํ†ตํ•ฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๋Š” CI/CD ํ”ผ๋“œ๋ฐฑ์— ์˜์กดํ•˜๊ฑฐ๋‚˜ CLI ๋„๊ตฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์ฒด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋ผ์ด์„ ์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    ๊ด€๋ฆฌํ˜• CodeQL ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” GitHub Advanced Security(GHAS)๋Š” GitHub Enterprise Cloud ๋ฐ Server ๊ณ ๊ฐ์—๊ฒŒ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ GitHub์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒ€์˜ ๋„์ž…์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๊ฐ€์น˜๊ฐ€ ์ œํ•œ๋จ
    ๊ฐ„๋‹จํ•œ C# ์•ฑ์ด๋‚˜ ๋น ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์›ํ•˜๋Š” ํŒ€์˜ ๊ฒฝ์šฐ, CodeQL์˜ ์„ค์ •๊ณผ ๋ณต์žก์„ฑ์€ Roslyn์ด๋‚˜ ReSharper์™€ ๊ฐ™์€ ๊ฐ€๋ฒผ์šด ๋„๊ตฌ์— ๋น„ํ•ด ์ด์ ์ด ๋” ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CodeQL์€ ๋ณด์•ˆ์„ ์ตœ์šฐ์„ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ๋งž์ถคํ˜• ์ฟผ๋ฆฌ ์„ธํŠธ ๋ฐ ์›Œํฌํ”Œ๋กœ ๊ตฌ์ถ•์— ํˆฌ์žํ•  ์˜ํ–ฅ์ด ์žˆ๋Š” ์กฐ์ง์—์„œ ํƒ์›”ํ•œ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค. ์—„๊ฒฉํ•œ ๊ทœ์ • ์ค€์ˆ˜ ์š”๊ตฌ ์‚ฌํ•ญ, ๋‹ค์ˆ˜์˜ ๊ธฐ์—ฌ์ž, ๊ทธ๋ฆฌ๊ณ  ์„ฑ์ˆ™ํ•œ DevSecOps ๋ฌธํ™”๋ฅผ ๊ฐ–์ถ˜ C# ํ”„๋กœ์ ํŠธ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ถ„์„๊ธฐ๋ฅผ ๋ณด์™„ํ•˜๋Š” ๊ณ„์ธต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ฉ๊ธฐ๋„

Aikido Security๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ๋ถ„์•ผ์˜ ์‹ ์ƒ ๊ธฐ์—…์œผ๋กœ, ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ SAST, SCA ๋ฐ ๋น„๋ฐ€ ์Šค์บ๋‹ ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉ ํ”Œ๋žซํผ์—์„œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„ํŽธ์„ฑ๊ณผ ์†๋„๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, GitHub, GitLab, Bitbucket, Azure DevOps์™€ ๊ฐ™์€ ์ธ๊ธฐ ํ”Œ๋žซํผ๊ณผ ์ฆ‰์‹œ ์—ฐ๋™๋˜๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ตœ์‹  ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Aikido๋Š” ReSharper๋‚˜ CodeQL๊ณผ ๊ฐ™์€ ๊ธฐ์กด์˜ ์‹ฌ์ธต์  ์ •์  ์ฝ”๋“œ ๋ถ„์„๊ธฐ๋Š” ์•„๋‹ˆ์ง€๋งŒ C# ๋ฐ .NET ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์›ํ•˜์—ฌ ํŠนํžˆ ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ๊ณผ ์ข…์†์„ฑ ์œ„ํ—˜ ์ธก๋ฉด์—์„œ ๊ท€์ค‘ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  • ๊ฐ€๋ณ๊ณ  GitHub, GitLab, Bitbucket ๋ฐ Azure์˜ CI/CD ์›Œํฌํ”Œ๋กœ์— ์‰ฝ๊ฒŒ ํ†ตํ•ฉ ๊ฐ€๋Šฅ
  • ํ•˜๋‚˜์˜ ํ”Œ๋žซํผ์—์„œ SAST, SCA(์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ ๋ถ„์„) ๋ฐ ๋น„๋ฐ€์— ๋Œ€ํ•œ ๋‚ด์žฅํ˜• ์Šค์บ๋‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋น„๋ฐ€, SQL ์ฃผ์ž…, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ข…์†์„ฑ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์ทจ์•ฝ์„ฑ ํƒ์ง€ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ C#์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€๋ณด๋‹ค๋Š” ๊ฐœ๋ฐœ์ž์™€ DevOps ํŒ€์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊น”๋”ํ•˜๊ณ  ํ˜„๋Œ€์ ์ธ UI
  • ์ƒํ™ฉ ์ธ์‹ ๋ฌธ์ œ ๋ถ„๋ฅ˜ ๋ฐ ์œ„ํ—˜ ์šฐ์„  ์ˆœ์œ„ ์ง€์ •์€ ์•Œ๋ฆผ โ€‹โ€‹ํ”ผ๋กœ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ์ค‘์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๋ณ‘ํ•ฉ์„ ์ฐจ๋‹จํ•˜๋Š” ๋“ฑ ์ •์ฑ… ๊ธฐ๋ฐ˜ ์ œ์–ด๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ์ ํŠธ ๋ฐ ์–ธ์–ด ์ž๋™ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ๊ทœ์น™ ๊ตฌ์„ฑ์„ ์œ„ํ•œ ์„ค์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์†Œ๊ทœ๋ชจ ํŒ€๊ณผ ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ์—ฌ์ž๋ฅผ ์œ„ํ•œ ๋ฌด๋ฃŒ ๊ณ„์ธต ์ œ๊ณต
  • ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ถœ๋ ฅ์„ ํ†ตํ•ด ๋น ๋ฅธ ์Šค์บ” ์‹œ๊ฐ„ ์ œ๊ณต
  • GDPR ๋ฐ ISO 27001 ์ค€์ˆ˜๋ฅผ ํ†ตํ•œ ๋ณด์•ˆ ์šฐ์„  ๊ธฐ์—… ๋ฌธํ™”

ํ•œ๊ณ„์™€ ๋‹จ์ 

Aikido๋Š” ํ˜„๋Œ€ ํŒ€์„ ์œ„ํ•œ ์ธ์ƒ์ ์ธ DevSecOps ํ”Œ๋žซํผ์ด์ง€๋งŒ C#์— ํŠนํ™”๋œ ์‹ฌ์ธต์ ์ธ ์ •์  ๋ถ„์„์ด๋‚˜ ๊ณ ๊ธ‰ ์ฝ”๋“œ ๊ฒ€์‚ฌ๋ฅผ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณต์žกํ•œ C# ์ฝ”๋“œ ํŒจํ„ด์— ๋Œ€ํ•œ ์ œํ•œ๋œ ๊ทœ์น™ ๊นŠ์ด
    ์•„์ดํ‚ค๋„๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ๋ณด๋‹ค๋Š” ๋ณด์•ˆ ์Šค์บ๋‹์— ๋” ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์œผ๋ฉฐ, NDepend๋‚˜ ReSharper์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋…ผ๋ฆฌ์  ๋˜๋Š” ์„ฑ๋Šฅ ๊ด€๋ จ ๊ฒ€์‚ฌ๊ฐ€ ๋งŽ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์กฐ์  ์„ค๊ณ„ ๊ฒฐํ•จ์„ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜ ๋ฆฌํŒฉํ† ๋ง ์ œ์•ˆ์„ ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด ๋ชจ๋ธ ์˜ค์šฉ, ์ˆœํ™˜ ์ข…์†์„ฑ ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ƒ„์ƒˆ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋Š” ์‹๋ณ„ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™ ์ƒ์„ฑ์ด๋‚˜ ๋ฏธ์„ธ ์กฐ์ •๋œ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ง€์›์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
    CodeQL์ด๋‚˜ Roslyn ๋ถ„์„๊ธฐ์™€ ๋‹ฌ๋ฆฌ ์‚ฌ์šฉ์ž๋Š” ์ž์ฒด ์ •์  ๊ทœ์น™์„ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ํƒ์ง€ ๋…ผ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • Visual Studio ๋˜๋Š” IDE ํ†ตํ•ฉ ์—†์Œ
    ๋ชจ๋“  ๊ฒฐ๊ณผ๋Š” ์›น ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ๋Œ“๊ธ€์„ ํ†ตํ•ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. IDE ๊ธฐ๋ฐ˜ ๋ฆฐํŒ…์— ์ต์ˆ™ํ•œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์ด ๋ถ€๋ถ„์ด ๋ถˆํŽธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ Git ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์ถ•๋จ
    ์ค‘์•™ ์ง‘์ค‘์‹ ์†Œ์Šค ์ œ์–ด๋‚˜ ์˜ค๋ž˜๋œ ๋ฐฐํฌ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์€ ์ž๋™ํ™” ๊ธฐ๋Šฅ์˜ ์ด์ ์„ ์–ป์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์Šค์บ๋‹์€ ๋กœ์ปฌ ๊ฐœ๋ฐœ ์ค‘์ด ์•„๋‹Œ CI์—์„œ ์ฃผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    ๊ฐœ๋ฐœ์ž ์›Œํฌํ”Œ๋กœ ๋‚ด์—๋Š” ์‚ฌ์ „ ์ปค๋ฐ‹ ํ›„ํฌ๋‚˜ ์‹ค์‹œ๊ฐ„ ์ฝ”๋“œ ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ํˆด์ด ์—†์Šต๋‹ˆ๋‹ค.

Aikido๋Š” ์ตœ์‹  CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ C#์„ ์‚ฌ์šฉํ•˜๋Š” ๋ณด์•ˆ์— ๋ฏผ๊ฐํ•œ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํŒ€์— ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ทจ์•ฝ์ ๊ณผ ๋ณด์•ˆ ๋น„๋ฐ€์— ๋Œ€ํ•œ ๋น ๋ฅธ ์ธ์‚ฌ์ดํŠธ์™€ ํญ๋„“์€ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„ํ‚คํ…์ฒ˜ ๋ถ„์„, ๋งž์ถคํ˜• ๊ทœ์น™ ์œ ์—ฐ์„ฑ ๋˜๋Š” ๊ณ ๊ธ‰ ํ’ˆ์งˆ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ํŒ€์˜ ๊ฒฝ์šฐ ๊ธฐ์กด ์ฝ”๋“œ ๋ถ„์„๊ธฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฅ ์†Œ์Šค

DeepSource๋Š” ์—ฌ๋Ÿฌ ์–ธ์–ด์— ๊ฑธ์ณ ์ •์  ๋ถ„์„, ๋ฒ„๊ทธ ํƒ์ง€, ๋ณด์•ˆ ์Šค์บ๋‹ ๋ฐ ์ฝ”๋“œ ์„œ์‹ ์ง€์ • ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ž๋™ํ™”๋œ ์ฝ”๋“œ ๊ฒ€ํ†  ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. Python, Go, JavaScript์™€ ๊ฐ™์€ ์–ธ์–ด์— ๋Œ€ํ•œ ์ง€์›์ด ๊ฐ•ํ™”๋˜์—ˆ์ง€๋งŒ, DeepSource๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๊น”๋”ํ•˜๊ณ  ์•ˆ์ „ํ•˜๋ฉฐ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก C# ๋ฐ .NET ์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ์ง€์›์„ ์ ์ง„์ ์œผ๋กœ ํ™•๋Œ€ํ•ด ์™”์Šต๋‹ˆ๋‹ค.

GitHub, GitLab, Bitbucket๊ณผ ๊ฐ™์€ ๋ฒ„์ „ ์ œ์–ด ํ”Œ๋žซํผ๊ณผ ํ†ตํ•ฉํ•˜์—ฌ ๋ชจ๋“  ์ปค๋ฐ‹๊ณผ ํ’€ ์š”์ฒญ์— ๋Œ€ํ•ด ์ •์  ๋ถ„์„์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  • ์„ฑ๋Šฅ, ๋ฒ„๊ทธ ์œ„ํ—˜, ์•ˆํ‹ฐํŒจํ„ด ๋ฐ ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์— ์ดˆ์ ์„ ๋งž์ถ˜ C#์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ •์  ๋ถ„์„ ์ง€์›
  • ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•ด GitHub, GitLab ๋ฐ Bitbucket๊ณผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ
  • ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ ๋ฌธ์ œ ํ•ด๊ฒฐ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ž๋™ ์ˆ˜์ • ์ œ์•ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ €์žฅ์†Œ์™€ ํŒ€ ์ „๋ฐ˜์˜ ์ฝ”๋“œ ์ƒํƒœ ํ†ต์ฐฐ๋ ฅ์„ ์œ„ํ•œ ํ†ตํ•ฉ ๋Œ€์‹œ๋ณด๋“œ
  • ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜์—ฌ ๊ฐ€๋ณ๊ณ  ๊ตฌ์„ฑ์ด ํ•„์š” ์—†๋Š” ์˜จ๋ณด๋”ฉ
  • ์ฝ”๋“œ ์ดํƒˆ, ์ค‘๋ณต ๋ฐ ์ ์šฉ ๋ฒ”์œ„ ์ถ”์„ธ์™€ ๊ฐ™์€ ์ธก์ • ํ•ญ๋ชฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„ ๋ฐ ๋ถ„๊ธฐ๋ณ„ ์ฝ”๋“œ ํ’ˆ์งˆ ํšŒ๊ท€์— ๋Œ€ํ•œ ๋น ๋ฅธ ํ†ต์ฐฐ๋ ฅ ์ œ๊ณต
  • ๋” ๋‚˜์€ ๋…ธ์ด์ฆˆ ์ œ์–ด๋ฅผ ์œ„ํ•ด ๋ฌด์‹œ ๊ทœ์น™, ์–ต์ œ ๋ฐ ์‹ฌ๊ฐ๋„ ์กฐ์ •์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์›น UI๋Š” ์ง๊ด€์ ์ด๋ฉฐ ๊ฐœ๋ฐœ์ž์™€ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฆฌ๋” ๋ชจ๋‘์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ธฐ๋Šฅ์—๋Š” ํŒ€ ๊ธฐ๋ฐ˜ ๊ถŒํ•œ ๋ฐ ๊ทœ์ • ์ค€์ˆ˜ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ โ€‹โ€‹ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

DeepSource๋Š” ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•˜๋Š” ํ”Œ๋žซํผ์ด์ง€๋งŒ ํŠน๋ณ„ํžˆ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. C# ํ”„๋กœ์ ํŠธ ๊ธฐ์—… ๋˜๋Š” ๋Œ€๊ทœ๋ชจ ๊ฐœ๋ฐœ์—์„œ:

  • C# ์ง€์›์€ Python์ด๋‚˜ JavaScript๋ณด๋‹ค ๋œ ์„ฑ์ˆ™ํ•ฉ๋‹ˆ๋‹ค.
    DeepSource๋Š” Roslyn, ReSharper, NDepend์™€ ๊ฐ™์€ ๋„๊ตฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ •์  ๊ทœ์น™์˜ ๊นŠ์ด์™€ ํญ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋ณต์žกํ•œ .NET ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒจํ„ด์˜ ๊ฒฝ์šฐ ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
  • ์ œํ•œ๋œ ๊ทœ์น™ ์‚ฌ์šฉ์ž ์ •์˜
    ์‚ฌ์šฉ์ž๋Š” ๋„๋ฉ”์ธ๋ณ„ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ์ •์  ๋ถ„์„ ๊ทœ์น™์„ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜๋Š” ๊ฒƒ ์ด์ƒ์œผ๋กœ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • Visual Studio์™€ ํ†ตํ•ฉ๋˜์ง€ ์•Š์Œ
    Visual Studio๋‚˜ Rider์™€ ๊ฐ™์€ IDE์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” CI ๊ธฐ๋ฐ˜ ํ”ผ๋“œ๋ฐฑ์— ์˜์กดํ•˜๊ฑฐ๋‚˜ DeepSource ์›น UI์—์„œ ์ˆ˜๋™์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์ˆ˜์ค€์˜ ๋ฌธ์ œ์— ์ดˆ์ ์„ ๋งž์ถ”์ง€๋งŒ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์˜ ๋ถ„์„์ด๋‚˜ ์ฝ”๋“œ ๊ตฌ์กฐ ์ตœ์ ํ™”๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ณ ๊ธ‰ ํ๋ฆ„ ๋ถ„์„์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ถ”์ ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ์ด๋กœ ์ธํ•ด ๋‹ค์ค‘์ค„ ์ทจ์•ฝ์ ์ด๋‚˜ ๋ณต์žกํ•œ ๋ณด์•ˆ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.
  • ํ”„๋ฆฌ๋ฏธ์—„ ๊ธฐ๋Šฅ์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ”Œ๋žœ ๋’ค์— ์ž ๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๊ณผ๊ฑฐ ์ถ”์ , ๊ทœ์ • ์ค€์ˆ˜ ๋ณด๊ณ , ์ •์ฑ… ์‹œํ–‰๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ƒ์œ„ ๊ณ„์ธต ๋ผ์ด์„ ์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์ด๋ฉฐ, ์—„๊ฒฉํ•˜๊ฒŒ ๊ทœ์ œ๋˜๋Š” ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์˜จํ”„๋ ˆ๋ฏธ์Šค ์˜ต์…˜์€ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

DeepSource๋Š” ์‹ฌ์ธต์ ์ธ ๊ตฌ์„ฑ ์—†์ด ๋น ๋ฅด๊ณ  ์ž๋™ํ™”๋œ ์ •์  ๋ถ„์„์„ ์›ํ•˜๋Š” ์ค‘์†Œ ๊ทœ๋ชจ C# ํŒ€์— ์ ํ•ฉํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. Git ๊ธฐ๋ฐ˜ CI ์›Œํฌํ”Œ๋กœ์— ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋ฉฐ ๊ธฐ์กด ์ฝ”๋“œ ๋ฆฐํ„ฐ๋ฅผ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค. ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ๊ณผ ์‹ฌ์ธต์ ์ธ .NET ๋‚ด๋ถ€ ์ง€์›์„ ์›ํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ํ”„๋กœ์ ํŠธ๋‚˜ ํŒ€์˜ ๊ฒฝ์šฐ, ๋‹ค๋ฅธ ์ „๋ฌธ ๋ถ„์„๊ธฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ฃจ๋‹ค#

Infer#๋Š” Microsoft Research์—์„œ Facebook์˜ Infer ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•œ C#์šฉ ์ •์  ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์‹œ์ € ๊ฐ„ ๋ถ„์„์— ์ค‘์ ์„ ๋‘์–ด null ์—ญ์ฐธ์กฐ, ๋ฆฌ์†Œ์Šค ๋ˆ„์ˆ˜, ๊ฒฝ์Ÿ ์กฐ๊ฑด, ๋ฉ”์„œ๋“œ ๊ฒฝ๊ณ„๋ฅผ ๋„˜๋‚˜๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๋ฒ„๊ทธ๋ฅผ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค. Infer#๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ์กด ๋ฆฐํ„ฐ(linter)์—์„œ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋Ÿฐํƒ€์ž„ ์ค‘์—๋งŒ ๋“œ๋Ÿฌ๋‚˜๋Š” ์‹ฌ๊ฐํ•œ ์˜๋ฏธ๋ก ์  ๋ฒ„๊ทธ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐœ๊ฒฌํ•˜๋„๋ก ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ .NET ์ค‘๊ฐ„ ์–ธ์–ด(IL)๋ฅผ ๋‚ด๋ถ€ ํ‘œํ˜„์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ๊ณ ๊ธ‰ ํ˜•์‹์  ๊ฒ€์ฆ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  • ๋ชจ๋ฐ”์ผ ๋ฐ ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ์˜ ๊ณ ๊ธ‰ ์ •์  ๋ถ„์„์œผ๋กœ ๋„๋ฆฌ ์ธ์ •๋ฐ›๋Š” Facebook์˜ Infer ์—”์ง„ ๊ธฐ๋ฐ˜
  • ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋‚˜ ํด๋ž˜์Šค์— ๊ฑธ์ณ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ํ”„๋กœ์‹œ์ € ๊ฐ„ ๋ฐ ๊ธฐํ˜ธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ํŠนํžˆ null ํฌ์ธํ„ฐ ์—ญ์ฐธ์กฐ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • .NET Intermediate Language(IL)์— ๋Œ€ํ•œ ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ๋ชจ๋“  .NET ์ง€์› ์–ธ์–ด์— ๋Œ€ํ•œ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Microsoft Research์—์„œ ๊ฐ•๋ ฅํ•œ ํ•™๋ฌธ์  ๊ธฐ๋ฐ˜์„ ๋ฐ”ํƒ•์œผ๋กœ ํ™œ๋ฐœํ•˜๊ฒŒ ๊ฐœ๋ฐœ
  • ๊ธฐ์—…์ด๋‚˜ ํ•™์ˆ ์  ์‚ฌ์šฉ์„ ์œ„ํ•œ ํ—ˆ๊ฐ€๋œ ๋ผ์ด์„ ์Šค๋ฅผ ๊ฐ–์ถ˜ ์˜คํ”ˆ ์†Œ์Šค
  • ์ž๋™ ๋ถ„์„์„ ์œ„ํ•ด MSBuild ๋ฐ CI ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํ†ตํ•ฉ ๊ฐ€๋Šฅ
  • ์—ฐ๊ตฌ ์„ค์ •, ๋ณด์•ˆ ์ฝ”๋”ฉ ๊ฐ์‚ฌ ๋˜๋Š” ๊ณต์‹ ๊ฒ€์ฆ ์›Œํฌํ”Œ๋กœ์˜ ์ผ๋ถ€๋กœ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ‘œ์ค€ ๋„๊ตฌ๋กœ๋Š” ํฌ์ฐฉํ•˜๊ธฐ ์–ด๋ ค์šด ์ž ์žฌ์ ์ธ ๋Ÿฐํƒ€์ž„ ์ถฉ๋Œ ๋ฐ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

Infer#๋Š” ๋ฒ”์œ„๊ฐ€ ๋„“์ง€๋งŒ ์ผ๋ฐ˜ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์„ฑ์„ ์ œํ•œํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์ •์  ๋ถ„์„๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ ์Šคํƒ€์ผ, ๋””์ž์ธ ๋˜๋Š” ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด
    Infer#๋Š” ๋ฒ„๊ทธ ๊ฐ์ง€์—๋งŒ ์ง‘์ค‘ํ•˜๋ฉฐ NDepend๋‚˜ ReSharper์™€ ๊ฐ™์€ ์ฝ”๋“œ ํ’ˆ์งˆ ์ธก์ • ํ•ญ๋ชฉ, ๋ณต์žก์„ฑ ๋ถ„์„, ๊ตฌ์กฐ์  ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Visual Studio ๋˜๋Š” IDE์™€ ํ†ตํ•ฉ๋˜์ง€ ์•Š์Œ
    ๋ชจ๋“  ์ƒํ˜ธ์ž‘์šฉ์€ ๋ช…๋ น์ค„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ํŽธ์ง‘๊ธฐ ๋‚ด ํ”ผ๋“œ๋ฐฑ์ด๋‚˜ ์ž๋™ ์ˆ˜์ •์„ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋†’์€ ๊ธฐ์ˆ ์  ์ง„์ž… ์žฅ๋ฒฝ
    IL, ๋ช…๋ น์ค„ ์ž‘์—…์— ๋Œ€ํ•œ ์ง€์‹์ด ํ•„์š”ํ•˜๋ฉฐ, ํŠน์ • ์ถœ๋ ฅ์„ ํ•ด์„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณต์‹์ ์ธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์นœ์ˆ™ํ•จ์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ถ€์กฑํ•œ ๋ฌธ์„œ์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์›
    Roslyn ๋ถ„์„๊ธฐ๋‚˜ SonarQube์™€ ๊ฐ™์€ ๋„๊ตฌ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ Infer#์—๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ํŠœํ† ๋ฆฌ์–ผ, ์˜ˆ์ œ ๋˜๋Š” ํ™œ์„ฑ ํฌ๋Ÿผ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด‘๋ฒ”์œ„ํ•œ ์ƒ์‚ฐ ์šฉ๋„๋กœ ์ ๊ทน์ ์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Œ
    ์ด๋Š” Microsoft Research ํ”„๋กœ์ ํŠธ์ด๋ฏ€๋กœ ์ผ๊ด€๋œ ์—…๋ฐ์ดํŠธ๋‚˜ ํ”„๋กœ๋•์…˜ ์ˆ˜์ค€์˜ ์ง€์›์„ ๋ฐ›์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • SCA(์ข…์†์„ฑ) ์Šค์บ๋‹์ด๋‚˜ ๋ณด์•ˆ ๊ด€๋ จ ๊ทœ์น™์ด ์—†์Šต๋‹ˆ๋‹ค.
    ์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ API ์‚ฌ์šฉ ๋˜๋Š” ๊ธฐํƒ€ ํ‘œ๋ฉด ์ˆ˜์ค€์˜ ๋ณด์•ˆ ๋ฌธ์ œ๋Š” ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ๊ธฐ์—… ํ”„๋กœ์ ํŠธ์˜ ํ™•์žฅ์„ฑ ๋ฌธ์ œ
    ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ ์šฉํ•˜๋ฉด ๋ถ„์„ ์†๋„๊ฐ€ ๋А๋ ค์ง€๊ณ  ์ƒ๋‹นํ•œ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Infer#๋Š” ์ •์‹ ๋ฒ„๊ทธ ๊ฐ์ง€, ์—ฐ๊ตฌ ์ค‘์‹ฌ ํ™˜๊ฒฝ, ๋˜๋Š” ์‹ฌ์ธต์ ์ธ ๊ฒฝ๋กœ ์ธ์‹ ๋ถ„์„์ด ํ•„์š”ํ•œ ๊ฐ์‚ฌ๋ฅผ ์šฐ์„ ์‹œํ•˜๋Š” ํŒ€์— ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ C# ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ผ์ƒ์ ์ธ ์ •์  ๋ถ„์„์„ ์œ„ํ•œ ํ„ดํ‚ค ์†”๋ฃจ์…˜์€ ์•„๋‹ˆ์ง€๋งŒ, ๋ณด์•ˆ ๋˜๋Š” ์•ˆ์ „์ด ์ค‘์š”ํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๊ฐ•๋ ฅํ•œ ๋ณด์™„ ๋„๊ตฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

ํ“จ๋งˆ ์Šค์บ”

Puma Scan์€ .NET ๋ฐ C# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ ์ทจ์•ฝ์ , ํŠนํžˆ ๋ณด์•ˆ ์ฝ”๋”ฉ ๊ด€ํ–‰ ๋ฐ ๊ทœ์ • ์ค€์ˆ˜์™€ ๊ด€๋ จ๋œ ์ทจ์•ฝ์ ์„ ์‹๋ณ„ํ•˜๋„๋ก ์„ค๊ณ„๋œ ์ •์  ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. OWASP Top 10 ๋ฐ CWE(Common Weakness Enumeration) ๋ฒ”์ฃผ์— ์ค‘์ ์„ ๋‘๊ณ  ๊ฐœ๋ฐœ๋˜์–ด ๋ณด์•ˆ์— ๋ฏผ๊ฐํ•œ .NET ํŒ€์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ๋„๊ตฌ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ํ˜•ํƒœ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. Visual Studio์— ํ†ตํ•ฉ๋œ Puma Scan Community Edition๊ณผ CI/CD ํ†ตํ•ฉ, ๊ทœ์น™ ์‚ฌ์šฉ์ž ์ •์˜, ์ค‘์•™ ๋ณด๊ณ ์™€ ๊ฐ™์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ Puma Scan Professional์ž…๋‹ˆ๋‹ค.

์žฅ์ 

  • OWASP ๋ฐ CWE ํ‘œ์ค€์— ๋งž์ถฐ์ง„ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ .NET ๋ฐ C# ๋ณด์•ˆ ์Šค์บ๋‹์— ๋งž๊ฒŒ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Visual Studio์— ์ง์ ‘ ํ†ตํ•ฉ๋˜์–ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ฝ”๋”ฉ ์ค‘ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ž…๋ ฅ์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ํ๋ฅด๋Š”์ง€ ์ถ”์ ํ•˜๊ณ  XSS, SQL ์ฃผ์ž…, ๋ช…๋ น ์ฃผ์ž… ๋“ฑ์˜ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ํ๋ฆ„ ๋ถ„์„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Professional Edition์€ DevSecOps ๊ด€ํ–‰์— ์ ํ•ฉํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ํ†ตํ•ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ทจ์•ฝ์„ฑ ๋ฒ”์ฃผ, ์‹ฌ๊ฐ๋„ ์ˆ˜์ค€ ๋ฐ ์ˆ˜์ • ์ง€์นจ์„ ํฌํ•จํ•œ ์ž์„ธํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋…์  ์ฝ”๋“œ ํŒจํ„ด์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ „๋ฌธ๊ฐ€ ์ „์šฉ)
  • SDLC ์ดˆ๊ธฐ์— ํŒ€์ด ๋ณด์•ˆ ์ฝ”๋”ฉ ์ •์ฑ…์„ ์‹œํ–‰ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.
  • ๊ทœ์ œ๋œ ์‚ฐ์—…์— ๋Œ€ํ•œ ์•ˆ์ „ํ•œ ๊ฐœ๋ฐœ ์ˆ˜๋ช… ์ฃผ๊ธฐ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ณด์™„ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€์†์ ์ธ ๊ทœ์น™ ์„ธํŠธ ์—…๋ฐ์ดํŠธ๊ฐ€ ํฌํ•จ๋œ Secure Development Solutions์—์„œ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

Puma Scan์€ ๊ฐ•๋ ฅํ•œ C# ๋ณด์•ˆ ๋ถ„์„์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ํŠนํžˆ ๊ด‘๋ฒ”์œ„ํ•œ ์ •์  ๋ถ„์„ ํ”Œ๋žซํผ๊ณผ ๋น„๊ตํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ๋ชฉํ•  ๋งŒํ•œ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณด์•ˆ์—๋งŒ ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค
    Puma Scan์€ ์„ฑ๋Šฅ ๋ฌธ์ œ, ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ, ์ฝ”๋“œ ์•…์ทจ ๋˜๋Š” ์„ค๊ณ„ ๊ฒฐํ•จ์— ๋Œ€ํ•œ ๋ถ„์„์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์šฉ ์ •์  ๋ถ„์„๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ปค๋ฎค๋‹ˆํ‹ฐ ์—๋””์…˜์€ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค
    CI/CD ํ†ตํ•ฉ, ํŒ€ ๋ณด๊ณ , ์‚ฌ์šฉ์ž ์ง€์ • ๊ทœ์น™ ๋ฐ ์ง€์› ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์—…์šฉ์œผ๋กœ๋Š” Professional ๋ฒ„์ „๋งŒ ์ œ๊ณต๋˜๋ฉฐ, ์ถ”๊ฐ€ ๋ผ์ด์„ ์Šค๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทœ์น™ ์„ธํŠธ ํญ์ด ์ข์Šต๋‹ˆ๋‹ค Fortify, Checkmarx, Veracode์™€ ๊ฐ™์€ ๋Œ€ํ˜• ํ”Œ๋žซํผ๋ณด๋‹ค.
    Puma Scan์€ ๋ณด๋‹ค ์ง„๋ณด๋œ ์˜ค์—ผ ์ถ”์ ์ด๋‚˜ ์ƒํ™ฉ ์ธ์‹ ์Šค์บ๋‹์ด ํ•„์š”ํ•œ ์ทจ์•ฝ์ ์„ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹œ๊ฐํ™”๋‚˜ ๊ตฌ์กฐ์  ํ†ต์ฐฐ๋ ฅ์ด ์—†์Œ
    NDepend์™€ ๊ฐ™์€ ๋„๊ตฌ์™€ ๋‹ฌ๋ฆฌ Puma Scan์€ ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„, ์ข…์†์„ฑ ๋งต ๋˜๋Š” ์ฝ”๋“œ ๊ตฌ์กฐ ๋ถ„์„์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์–ธ์–ด์— ๋Œ€ํ•œ SAST ์ง€์› ๋ถ€์กฑ
    Puma Scan์€ C#์—๋งŒ ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, JavaScript, Java ๋˜๋Š” Python ์Šค์บ๋‹์ด ํ•„์š”ํ•œ ํด๋ฆฌ๊ธ€๋กฏ ์ฝ”๋“œ๋ฒ ์ด์Šค๋‚˜ ํ’€์Šคํƒ ํŒ€์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์—…๋ฐ์ดํŠธ์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ทœ๋ชจ๊ฐ€ ๋” ์ž‘์Šต๋‹ˆ๋‹ค.
    Snyk๋‚˜ GitHub์˜ CodeQL๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ์ค‘์‹ฌ ์ƒํƒœ๊ณ„์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ, Puma Scan์€ ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜๊ณผ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์›์ด ๋” ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

Puma Scan์€ ์‹œํ”„ํŠธ-๋ ˆํ”„ํŠธ ์ทจ์•ฝ์  ํƒ์ง€๋ฅผ ํ†ตํ•ด ๋ณด์•ˆ ์ฝ”๋“œ๋ฅผ ์ผ์ƒ ์—…๋ฌด์˜ ์ผ๋ถ€๋กœ ์œ ์ง€ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ณด์•ˆ ์ค‘์‹ฌ C# ๊ฐœ๋ฐœํŒ€์— ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๊ธˆ์œต์ด๋‚˜ ์˜๋ฃŒ์ฒ˜๋Ÿผ ๊ทœ์ • ์ค€์ˆ˜์— ๋ฏผ๊ฐํ•œ ์‚ฐ์—…์—์„œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋”์šฑ ํฌ๊ด„์ ์ธ ๋ถ„์„์ด๋‚˜ ๋” ๊ด‘๋ฒ”์œ„ํ•œ ์–ธ์–ด ์ง€์›์„ ์›ํ•˜๋Š” ํŒ€์€ Puma Scan์„ ๋ณด์™„ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด์•ˆ ์ฝ”๋“œ ์Šค์บ”

๋ณด์•ˆ ์ฝ”๋“œ ์Šค์บ”(SCS)์€ C# ๋ฐ .NET ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์‹๋ณ„ํ•˜๋„๋ก ์„ค๊ณ„๋œ ๋ฌด๋ฃŒ ์˜คํ”ˆ ์†Œ์Šค Roslyn ๊ธฐ๋ฐ˜ ์ •์  ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Visual Studio ๋ฐ MSBuild๋ฅผ ํ†ตํ•ด ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ๊ฐœ๋ฐœ์ž ์›Œํฌํ”Œ๋กœ์— ์ง์ ‘ ํ†ตํ•ฉ๋˜๋ฉฐ, ์ฃผ๋กœ OWASP Top 10 ๋ฐ CWE ํ‘œ์ค€์—์„œ ์ง€์ ๋œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋”ฉ ํŒจํ„ด์„ ํƒ์ง€ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

SCS๋Š” ๋ณต์žกํ•œ ์„ค์ •์ด๋‚˜ ๋ฌด๊ฑฐ์šด ๋ผ์ด์„ ์Šค ์—†์ด ๊ฐœ๋ฐœ ์ค‘์— ๊ฐ€๋ณ๊ณ  ๋ณด์•ˆ ์ค‘์‹ฌ์˜ ํ”ผ๋“œ๋ฐฑ์„ ์›ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  • Roslyn ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์ถ•๋˜์–ด .NET ์ƒํƒœ๊ณ„์™€ ๋†’์€ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Visual Studio ๋ฐ MSBuild์™€์˜ ์›ํ™œํ•œ ํ†ตํ•ฉ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๊ฐ์ง€ ๋ฐ ํ”ผ๋“œ๋ฐฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์ทจ์•ฝ์ ์„ ํ‘œ์ ์œผ๋กœ ์‚ผ์Šต๋‹ˆ๋‹ค.
    • SQL ์ฃผ์ž…
    • XSS (๊ต์ฐจ ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…)
    • ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ž๊ฒฉ ์ฆ๋ช…
    • ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์—ญ ์ง๋ ฌํ™”
    • ๋ช…๋ น ์ฃผ์ž…
  • ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๋ฉฐ ๋นŒ๋“œ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • NuGet ๋˜๋Š” GitHub Actions๋ฅผ ํ†ตํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ž๋™ ์Šค์บ๋‹์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋นˆ๋ฒˆํ•œ ์—…๋ฐ์ดํŠธ์™€ ํ™œ์„ฑ GitHub ์ €์žฅ์†Œ
  • C# ํ”„๋กœ์ ํŠธ์˜ ์•ˆ์ „ํ•œ ๊ฐœ๋ฐœ ๊ด€ํ–‰์„ ์œ„ํ•œ ์ข‹์€ ์‹œ์ž‘์ 
  • SARIF ํ˜•์‹์˜ ์ถœ๋ ฅ์„ ์ง€์›ํ•˜์—ฌ ๋ณด์•ˆ ๋Œ€์‹œ๋ณด๋“œ ๋ฐ ์ง‘๊ณ„๊ธฐ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

C# ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ๊ฐ•๋ ฅํ•œ ์œ ์šฉ์„ฑ์ด ์žˆ์ง€๋งŒ, Security Code Scan์€ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ๊ทœ์ œ๊ฐ€ ์—„๊ฒฉํ•œ ํ™˜๊ฒฝ์—์„œ์˜ ์ ํ•ฉ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ œํ•œ๋œ ๋ฒ”์œ„
    ๋ณด์•ˆ ์ทจ์•ฝ์ ๋งŒ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฌธ์ œ, ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์œ„๋ฐ˜์€ ๊ฐ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ์ทจ์•ฝ์  ํƒ์ง€
    SCS๋Š” ์ผ๋ฐ˜์ ์ธ ์‹ค์ˆ˜๋ฅผ ํฌ์ฐฉํ•˜์ง€๋งŒ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์˜ค์—ผ ์ถ”์ ๊นŠ์€ ์ ˆ์ฐจ ๊ฐ„ ๋ถ„์„์˜ˆ์‚ฐ ๋ฐ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ชจ๋ธ๋ง Fortify๋‚˜ CodeQL๊ณผ ๊ฐ™์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๋„๊ตฌ์—์„œ ๋ฐœ๊ฒฌ๋ฉ๋‹ˆ๋‹ค.
  • UI, ๋Œ€์‹œ๋ณด๋“œ ๋˜๋Š” ๋ณด๊ณ  ๊ณ„์ธต์ด ์—†์Šต๋‹ˆ๋‹ค.
    ๊ฐœ๋ฐœ์ž๋Š” ์‹œ๊ฐํ™”, ๊ธฐ๋ก ์ถ”์  ๋˜๋Š” ์ค‘์•™ ๋ณด๊ณ ์„œ ๊ด€๋ฆฌ ์—†์ด ๋นŒ๋“œ ์ถœ๋ ฅ์ด๋‚˜ IDE ๊ฒฝ๊ณ ์—๋งŒ ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ œํ•œ๋œ ์‚ฌ์šฉ์ž ์ •์˜
    SCS์—์„œ๋Š” ๋…์ ์  ์œ„ํ˜‘์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์„ธ๋ถ€์ ์œผ๋กœ ์กฐ์ •๋œ ๊ทœ์น™ ๊ตฌ์„ฑ์ด๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • .NET ์ด์™ธ์˜ ์–ธ์–ด๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    SCS๋Š” C#/.NET ์ „์šฉ์ž…๋‹ˆ๋‹ค. ํด๋ฆฌ๊ธ€๋กฏ ์Šคํƒ์ด๋‚˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ํŒ€์—๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋†’์€ ๋ณด์•ˆ์ด๋‚˜ ๊ทœ์ • ์ค€์ˆ˜๊ฐ€ ์ค‘์š”ํ•œ ํ™˜๊ฒฝ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    SCS๋Š” ์˜ˆ๋ฐฉ์— ๋„์›€์ด ๋˜์ง€๋งŒ, PCI-DSS๋‚˜ ISO 27001๊ณผ ๊ฐ™์€ ํ‘œ์ค€์ด ์š”๊ตฌํ•˜๋Š” ์‹ฌ์ธต์ ์ด๊ฑฐ๋‚˜ ๊ฐ์‚ฌ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์„ ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

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

์†Œ๋‚˜ํ๋ธŒ

SonarQube๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ง€์†์ ์œผ๋กœ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”Œ๋žซํผ์œผ๋กœ, C#์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ, ์ทจ์•ฝ์ , ์ฝ”๋“œ ์Šค๋ฉœ, ์ค‘๋ณต์„ ๋ถ„์„ํ•˜์—ฌ ํŒ€์ด ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ๋ฅผ ์‹œํ–‰ํ•˜๊ณ  ๊ฑด๊ฐ•ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ์†Œ๊ทœ๋ชจ ํŒ€๊ณผ ๋Œ€๊ทœ๋ชจ ๊ธฐ์—… ๋ชจ๋‘์—์„œ DevOps ํ†ตํ•ฉ ๋ฐ ์ง€์†์ ์ธ ํ’ˆ์งˆ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

SonarQube๋Š” SonarC# ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด C# ๋ถ„์„์„ ์ง€์›ํ•˜๋ฉฐ .NET Core, .NET 5 ์ด์ƒ ๋ฐ ์ด์ „ .NET Framework ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. Visual Studio์™€ ๊ฐ™์€ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” CI/CD ์‹œ์Šคํ…œ ๋ฐ IDE์™€๋„ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  • ๋ฒ„๊ทธ, ์ทจ์•ฝ์„ฑ, ์ฝ”๋“œ ๋ƒ„์ƒˆ, ๊ธฐ์ˆ  ๋ถ€์ฑ„ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ ์ง€ํ‘œ๋ฅผ ํฌํ•จํ•œ ํฌ๊ด„์ ์ธ ์ •์  ์ฝ”๋“œ ๋ถ„์„
  • C# ๋ฐ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›์œผ๋กœ ๋‹ค๊ตญ์–ด ํ”„๋กœ์ ํŠธ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ํ’ˆ์งˆ ์ถ”์„ธ, ์ ์šฉ ๋ฒ”์œ„ ๋ฐ ํ•ซ์ŠคํŒŸ์„ ์‹œ๊ฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ค‘์•™ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํ’€ ์š”์ฒญ์ด๋‚˜ CI ๋นŒ๋“œ ์ค‘์— ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • GitHub, Azure DevOps, Jenkins, GitLab, Bitbucket ๋ฐ ๋‹ค์–‘ํ•œ CI/CD ํ”Œ๋žซํผ๊ณผ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • SonarLint์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด Visual Studio์—์„œ ์ง์ ‘ ๋ฌธ์ œ๋ฅผ ๊ฐ•์กฐ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • CWE, OWASP ๋ฐ SANS ํ‘œ์ค€์— ๋งคํ•‘๋œ ๋ณด์•ˆ ์ค‘์‹ฌ ๊ทœ์น™์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํšŒ๊ท€ ๋ฐ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ž์„ธํ•œ ๋ณด๊ณ ์„œ์™€ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ํ•„์ˆ˜ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๋ฌด๋ฃŒ ์ปค๋ฎค๋‹ˆํ‹ฐ ์—๋””์…˜๊ณผ ๊ณ ๊ธ‰ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์œ„ํ•œ ์œ ๋ฃŒ ๊ณ„์ธต
  • ์ง€์  ๋ฐ PR ๋ถ„์„์„ ์ง€์›ํ•˜์—ฌ ๋ณ‘ํ•ฉ ์ „ ํ’ˆ์งˆ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋‹จ์ 

SonarQube๋Š” ๊ทธ ์žฅ์ ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ณด๋‹ค ๊ณ ๊ธ‰ ํ™˜๊ฒฝ์ด๋‚˜ ๋ณด์•ˆ์— ๋ฏผ๊ฐํ•œ ํ™˜๊ฒฝ์—์„œ C# ์ •์  ๋ถ„์„์— ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณด์•ˆ ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ๋œ ๊นŠ์ด
    SonarQube๋Š” ๊ธฐ๋ณธ์ ์ธ ์ทจ์•ฝ์ ์„ ๋‹ค๋ฃจ์ง€๋งŒ ๋‹ค์Œ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ฌ์ธต์  ์˜ค์—ผ ๋ถ„์„ or ์ ˆ์ฐจ ๊ฐ„ ํ๋ฆ„ ์ถ”์  Fortify, CodeQL, Checkmarx์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.
  • ๊ทœ์น™ ์‚ฌ์šฉ์ž ์ •์˜๊ฐ€ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค ์ปค๋ฎค๋‹ˆํ‹ฐ ์—๋””์…˜์—์„œ
    ๊ณ ๊ธ‰ ๊ทœ์น™ ํŽธ์ง‘, ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ฐ ๊ทœ์ • ์ค€์ˆ˜ ๋ณด๊ณ ์˜ ๊ฒฝ์šฐ Developer ๋˜๋Š” Enterprise Edition์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.๋น„์šฉ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ๋Š” ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋งค์šฐ ํฐ ์†”๋ฃจ์…˜์„ ๋ถ„์„ํ•˜๋ฉด ์Šค์บ” ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ธํ”„๋ผ ํŠœ๋‹์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ค์ • ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
    ์˜จํ”„๋ ˆ๋ฏธ์Šค ๋ฐฐํฌ์—๋Š” ๊ตฌ์„ฑ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ง€์›, ๋ฐฑ์—… ๋ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์†Œ๊ทœ๋ชจ ํŒ€์—๋Š” ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Ÿฐํƒ€์ž„ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค
    ์ •์  ๋ถ„์„๋งŒ์ด๋ž€ ๋‹ค์Œ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์–‘ ์„ฑ ๋˜๋Š” ์ปจํ…์ŠคํŠธ๋ณ„ ๋Ÿฐํƒ€์ž„ ๋ฌธ์ œ๋ฅผ ๋†“์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์œ„ํ˜‘ ๋ชจ๋ธ๋ง์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜ ์‹œ๊ฐํ™”์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›์ด ์—†์Šต๋‹ˆ๋‹ค.
    NDepend๋‚˜ Resharper์ฒ˜๋Ÿผ ์ฝ”๋“œ ๊ตฌ์กฐ, ์ข…์†์„ฑ ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทœ์ œ๋œ ์‚ฐ์—…์—๋Š” ๋ณด์•ˆ ๊ทœ์น™์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ผ๋ฐ˜์ ์ธ ์ธ์‹์— ๋„์›€์ด ๋˜์ง€๋งŒ ํ”Œ๋žซํผ์˜ ๋ณด์•ˆ ๊ธฐ๋Šฅ์€ ์ข…์ข… ๋ณด์ถฉ ๊ธฐ์—…์˜ ๋‹ค๋ฅธ ์ „์šฉ SAST ๋„๊ตฌ์— ์˜ํ•ด.

SonarQube๋Š” ํŠนํžˆ DevOps ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐ•ํ™” ๋ฐ ์ง€์†์ ์ธ ๊ฒ€์‚ฌ์— ๋งค์šฐ ํšจ๊ณผ์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ฌ์ธต์ ์ธ ๋ณด์•ˆ ๋ณด์ฆ์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜ ๊ฐ๋…์„ ์œ„ํ•ด์„œ๋Š” ๋‹ค๊ณ„์ธต ์ •์  ๋ถ„์„ ์ „๋žต์—์„œ ๋‹ค๋ฅธ ์ „๋ฌธ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

C# ์ •์  ์ฝ”๋“œ ๋ถ„์„ ํ™˜๊ฒฝ ํƒ์ƒ‰

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

Coverity, Fortify, Veracode์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ์ƒ์šฉ ํ”Œ๋žซํผ๋ถ€ํ„ฐ StyleCop, FxCop, Security Code Scan๊ณผ ๊ฐ™์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์› ์œ ํ‹ธ๋ฆฌํ‹ฐ์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๊ฐœ๋ฐœ์ž์™€ ๊ธฐ์—… ๋ชจ๋‘์—๊ฒŒ ๊ด‘๋ฒ”์œ„ํ•œ ์†”๋ฃจ์…˜์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์†”๋ฃจ์…˜์€ ๊ณ ์œ ํ•œ ๊ฐ•์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์‹ฌ์ธต์ ์ธ ์ทจ์•ฝ์  ์Šค์บ๋‹์„ ์ œ๊ณตํ•˜๋Š” ์†”๋ฃจ์…˜๋„ ์žˆ๊ณ , ์•„ํ‚คํ…์ฒ˜ ๋ชจ๋ธ๋ง, ๊ฐœ๋ฐœ์ž ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ, ์›ํ™œํ•œ CI/CD ํ†ตํ•ฉ์„ ์ค‘์‹œํ•˜๋Š” ์†”๋ฃจ์…˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆˆ์— ๋„๋Š” ์ ์€ ๋ฉ€ํ‹ฐ ํˆด ์ „๋žต์˜ ์ค‘์š”์„ฑ์ด ์ปค์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„๋Œ€ ์—”์ง€๋‹ˆ์–ด๋ง ์กฐ์ง์€ ๋‹จ์ผ ๋ถ„์„๊ธฐ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ReSharper, CodeRush, Roslyn Analyzer์™€ ๊ฐ™์€ IDE ํ†ตํ•ฉ ๋ฆฐํ„ฐ์™€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ SAST ๋„๊ตฌ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ณ„์ธต์  ๊ฐ€์‹œ์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. ํ•œํŽธ, DevSecOps ํŒ€์€ Semgrep, Snyk, CodeQL๊ณผ ๊ฐ™์€ ์†”๋ฃจ์…˜์„ ์ž๋™ํ™”๋œ ํŒŒ์ดํ”„๋ผ์ธ์— ์ ์  ๋” ๋งŽ์ด ๋‚ด์žฅํ•˜์—ฌ ๋ฐฐํฌ ์ „์— ์ทจ์•ฝ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์„ ํƒ๋“ค ๊ฐ€์šด๋ฐ, SMART TS XL ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ํ”Œ๋žซํผ์œผ๋กœ ๋ถ€์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด‘๋ฒ”์œ„ํ•œ ๊ทœ์น™ ์‚ฌ์šฉ์ž ์ •์˜, ์ •๋ฐ€ํ•œ COBOL ๋ฐ ๋ ˆ๊ฑฐ์‹œ ์ง€์›์„ ํ†ตํ•ด ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ •์  ๋ถ„์„ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ด์ œ๋Š” ์ตœ์‹  C# ์ฝ”๋“œ๋ฒ ์ด์Šค๊นŒ์ง€ ์ง€์› ๋ฒ”์œ„๋ฅผ ํ™•์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋Šฅ๋ ฅ์€ ๋‹จ์ผ ํ”Œ๋žซํผ์—์„œ ํ’ˆ์งˆ๊ณผ ๋ณด์•ˆ์„ ํ†ตํ•ฉํ•˜๋ ค๋Š” ๋Œ€๊ทœ๋ชจ, ๊ทœ์ œ ๋Œ€์ƒ ๋˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์กฐ์ง์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์— ์ ํ•ฉํ•œ ๋„๊ตฌ ์„ ํƒ

๊ถ๊ทน์ ์œผ๋กœ C#์— "์ตœ๊ณ ์˜" ์ •์  ๋ถ„์„ ๋„๊ตฌ๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ํŒ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํฌ๊ธฐ์™€ ๋ณต์žก์„ฑ
  • ๋ณด์•ˆ ๋ฐ ๊ทœ์ • ์ค€์ˆ˜ ์š”๊ตฌ ์‚ฌํ•ญ
  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ฐ CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ์˜ ํ†ตํ•ฉ
  • ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ ๊ทœ์น™ ํ™•์žฅ์„ฑ
  • ๋น„์šฉ, ๋ผ์ด์„ผ์‹ฑ ๋ฐ ์ง€์› ์š”๊ตฌ ์‚ฌํ•ญ

๋‹จ์ผ ๋„๊ตฌ๋งŒ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ํ•ด๊ฒฐํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ง„์ •ํ•œ ๊ฐ€์น˜๋Š” ์›Œํฌํ”Œ๋กœ์™€ ์œ„ํ—˜์— ๋งž์ถฐ ๋ถ„์„๊ธฐ, ๋ฆฐํ„ฐ, ์Šค์บ๋„ˆ๋ฅผ ํ†ตํ•ฉ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค.

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