
보안 코딩이란 무엇인가? 기술, 표준 및 리소스
소프트웨어 취약점이 부차적인 문제나 혁신의 장애물로 간주될 때, 기업들은 데이터 유출, 평판 손상 및 막대한 법적 책임에 노출됩니다. 사이버 공격은 종종 더 엄격한 개발 관행을 통해 방지할 수 있었던 코드의 취약점을 악용합니다.
안전한 코딩은 개발의 각 단계에 보안 원칙을 통합함으로써 이러한 과제를 해결합니다. 취약점이 발견된 후 패치를 적용하는 대신, 개발자는 인젝션 공격 및 크로스 사이트 스크립팅(XSS)과 같은 일반적인 위협에 대한 내장형 보호 기능을 갖춘 코드를 작성합니다. 보안 코딩이 어떻게 기업이 위험을 줄이고 사용자 신뢰를 유지하며 규제 요건을 준수하는 동시에 신뢰할 수 있고 고품질의 소프트웨어를 제공할 수 있는지 자세히 살펴보겠습니다.
보안 코딩이란 무엇인가요?
안전한 코딩은 소프트웨어 작성 시 잠재적 취약점을 수정하기 위해 보안 모범 사례를 따르는 원칙입니다. 보안을 개발 과정의 별도 단계로 취급하기보다는, 보안 코딩은 검증된 보호 조치를 초기 단계부터 통합하여 개발자가 코드 보안을 책임지고 효과적으로 적용할 수 있는 역량을 갖추도록 보장합니다.
오픈 월드와이드 애플리케이션 보안 프로젝트(OWASP)나 소프트웨어 엔지니어링 연구소의 CERT 부서와 같은 기관에서 생산하는 공인된 안전한 코딩 표준은 공격자들이 악용하는 일반적인 함정을 피하려는 개발자들에게 나침반 역할을 할 수 있습니다. 현재 사이버 보안 환경에서는 기존 워크플로우에 이러한 전략을 안전하게 구현하기 위해 안전한 코딩에 대한 기본적이고 실용적인 기술을 지속적으로 활용하는 것이 필수적입니다. 예를 들어, 최대한 많은 사용자 입력을 검증하면 SQL 인젝션 공격을 방지할 수 있으며, 출력 코딩을 통해 XSS를 차단할 수 있습니다. 이러한 안전한 코딩 관행은 침해 위험을 줄이고 진화하는 사이버 위협에 견딜 수 있는 더 탄력적인 애플리케이션을 구축하는 데 기여합니다.
보안 코딩이 왜 그렇게 중요한가?
보안 코딩은 중요합니다. 많은 성공적인 사이버 공격이 개발 과정에서 방지할 수 있었던 취약점을 악용하기 때문입니다. 초기 단계부터 보안 관행을 우선시함으로써 공격자가 데이터를 침해하거나 운영을 방해하는 데 이용할 수 있는 취약점이 도입될 가능성을 줄일 수 있습니다. 소프트웨어 개발 생명주기(SDLC)의 각 단계에 보안을 통합하면 모든 기능, 업데이트 및 통합이 보호를 고려하여 설계되도록 보장합니다.
개발 단계에서 위험을 선제적으로 처리하는 것은 배포 후 수정하는 것보다 훨씬 비용 효율적입니다. 배포 후 수정은 긴급 패치, 서비스 중단 및 사고 대응 자원이 필요할 수 있습니다. 또한 데이터 보호 규정 준수를 향상시켜 잠재적인 벌금 및 법적 문제를 방지합니다. 안전한 코딩 관행은 기업에 대한 소비자 신뢰를 강화하고 강화된 보안을 브랜드 평판에 통합합니다.
코드에 공통적으로 존재하는 보안 취약점
안전한 코딩은 공격자가 악용하는 가장 빈번하고 위험한 취약점과 AI 기반 코딩 도구 사용과 같은 신종 위협 경로를 방지하는 것을 목표로 합니다. 다음은 몇 가지 일반적인 취약점, 이들이 초래할 수 있는 피해, 그리고 안전한 코딩이 이를 완화하는 데 어떻게 기여할 수 있는지에 대한 개요입니다.

역직렬화 오류
디세리얼라이제이션 결함은 애플리케이션이 외부 출처의 데이터를 적절한 검증 없이 수신하고 처리할 때 발생합니다. 세리얼라이제이션은 객체를 저장하거나 전송 가능한 형식으로 변환하는 반면, 디세리얼라이제이션은 해당 객체를 재구성하여 사용 가능하게 합니다. 디세리얼라이제이션 결함의 영향은 심각할 수 있으며, 임의 코드 실행이나 권한 상승을 초래할 수 있습니다. 안전한 코딩은 신뢰할 수 있고 검증된 데이터만 디세리얼라이즈되도록 보장하고, 신뢰할 수 없는 입력에 대한 네이티브 디세리얼라이제이션을 가능한 한 피함으로써 이 문제를 해결합니다.
주입 공격
주입 공격은 공격자가 애플리케이션이 명령이나 쿼리의 일부로 해석하는 입력을 제공할 때 발생합니다. 가장 잘 알려진 유형은 SQL 주입으로, 악의적인 SQL 문이 쿼리에 삽입되어 데이터베이스 콘텐츠에 접근하거나 수정하는 것입니다. 다른 유형으로는 공격자가 임의의 명령을 실행하는 명령어 주입과 LDAP(경량 디렉터리 접근 프로토콜) 주입이 있습니다. 주입 공격의 결과는 무단 데이터 접근 및 삭제부터 시스템 전체 침해에 이르기까지 다양합니다. 개인 정보, 금융 정보 또는 기밀 정보가 포함된 데이터베이스는 주요 표적이 됩니다. 안전한 코딩은 매개변수화된 쿼리나 준비된 문 사용, 처리 전 신뢰할 수 없는 데이터 이스케이프 처리, 엄격한 입력 검증을 통해 인젝션 취약점을 방지합니다. 이러한 안전한 코딩 관행은 공격자가 애플리케이션의 예상 동작을 변경하는 것을 막을 수 있습니다.

크로스 사이트 스크립팅(XSS)
크로스 사이트 스크립팅(XSS) 은 웹 애플리케이션을 대상으로 하는 인젝션 공격의 한 형태로, 다른 사용자가 보는 페이지에 악성 스크립트를 삽입합니다. 이는 일반적으로 애플리케이션이 검증되지 않은 사용자 입력을 출력에 포함시킬 때 발생합니다. 다른 사용자의 브라우저가 해당 페이지를 표시하면 악성 스크립트가 실행되어 쿠키를 탈취하거나 키 입력을 가로채거나 사용자를 악성 사이트로 리디렉션할 수 있습니다.
XSS의 영향에는 세션 탈취 및 신원 도용이 포함될 수 있습니다. 기업에게는 고객 신뢰를 훼손하며, 민감한 데이터가 유출될 경우 규제적 결과를 초래할 수 있습니다. 안전한 코딩은 사용자가 제공한 모든 입력을 표시하기 전에 정제하고 인코딩하며, 출력을 자동으로 이스케이프하는 프레임워크를 사용하고, 실행 가능한 스크립트를 제한하기 위해 콘텐츠 보안 정책(CSP)을 구현함으로써 XSS를 해결합니다.
출입 통제
제어 관련 취약점은 사용자가 볼 수 있거나 수행할 수 있는 항목에 대한 규칙이 올바르게 정의되거나 적용되지 않을 때 발생합니다. 결함이 있는 접근 제어는 공격자가 의도된 사용자 역할 제한을 우회하여 잠재적으로 민감한 데이터를 읽거나, 레코드를 수정하거나, 특권 사용자만 수행할 수 있는 작업을 수행할 수 있게 합니다.
접근 제어 문제는 중대한 도전 과제이며, 특히 AI 코딩 도구는 이 취약점 유형을 효과적으로 처리하는 데 어려움을 겪어 왔습니다. 이는 개발자의 기술과 인식 제고의 필요성을 강조합니다. 접근 제어 위반의 영향은 상당합니다. 예를 들어, 공격자가 관리자 전용 기능에 접근할 수 있다면 보안 설정을 비활성화하거나, 개인 정보를 추출하거나, 다른 사용자로 위장할 수 있습니다.
안전한 코딩 관행은 최소 권한 원칙에 따라 각 요청에 대해 서버 측 권한 제어 기능을 적용하고, 보안 조치로서 링크 숨김과 같은 단순한 은폐에만 의존하지 않음으로써 이러한 위험을 방지합니다. 또한 엄격한 접근 제어 테스트를 수행함으로써 이러한 보호 장치가 장기적으로 견고하게 유지되도록 보장할 수 있습니다.

크로스 사이트 요청 위조(CSRF)
크로스 사이트 요청 위조(CSRF) 공격은 사용자가 인증된 다른 사이트에서 원치 않는 작업을 수행하도록 강요합니다. 이는 자금 이체, 이메일 주소 변경 또는 계정 설정 수정 등을 포함할 수 있습니다. 이 공격이 가능한 이유는 브라우저가 위조된 요청에 쿠키와 같은 유효한 인증 토큰을 자동으로 포함시키기 때문입니다.
안전한 코딩은 각 사용자 세션마다 고유한 CSRF 방지 토큰을 구현하고 상태 변경 요청 시마다 이를 검증함으로써 CSRF로부터 보호합니다. 추가 방어 수단으로는 중요한 작업에 대한 재인증 요구 및 쿠키의 SameSite 속성 설정을 통해 쿠키가 사이트 간 요청과 함께 전송되는 것을 방지하는 것이 포함됩니다. 이러한 보호 기능을 개발 라이프사이클에 통합함으로써 시스템이 합법적이고 의도된 작업만 처리할 가능성을 높일 수 있습니다.
비보안 인증
비보안 인증은 사용자의 신원 확인 절차가 취약하거나 예측 가능하거나 결함이 있을 때 발생합니다. 이는 불량한 비밀번호 정책, 보안되지 않은 자격 증명 저장, 또는 다중 요소 인증(MFA) 부재로 인해 발생할 수 있습니다. 공격자는 이러한 취약점을 다양한 방법으로 악용할 수 있습니다. 여기에는 무차별 대입 공격, 자격 증명 스푸핑, 전송 중인 암호화되지 않은 자격 증명 정보 가로채기 등이 포함됩니다. 비보안 인증의 영향은 심각합니다. 공격자에게 사용자 계정, 관리 권한, 민감한 데이터에 대한 직접적인 접근 권한을 제공할 수 있기 때문입니다. 일단 내부로 침투한 공격자는 시스템을 더욱 손상시키거나 귀중한 정보를 탈취할 수 있습니다.
보안 코딩은 엄격한 비밀번호 요구사항을 적용하고, 저장된 인증 정보를 해시 처리 및 분류하며, 모든 인증 교환에 HTTPS와 같은 보안 프로토콜을 사용하고, 추가 검증 계층을 제공하기 위해 MFA를 통합함으로써 이 취약점을 해결합니다. 개발자는 또한 실패한 시도 횟수를 제한하고 의심스러운 활동을 신속하게 탐지하는 로그인 메커니즘을 설계해야 합니다. 이를 통해 인증 시스템이 취약점이 아닌 견고한 방어선 역할을 할 수 있도록 해야 합니다.
안전한 코딩을 위한 6가지 실천 방법
안전한 소프트웨어 개발은 기존 위협을 아는 데 그치지 않습니다. 검증된 안전한 코딩 관행과 패턴을 학습하고 적용해야 합니다. 아래 기술들은 개발자가 각 프로젝트에 보안을 통합하기 위해 취할 수 있는 구체적인 조치들을 제시합니다.
1. 사용자 접근 제어 구현
위에서 언급한 바와 같이, 사용자 접근 제어는 시스템 내 각 사용자 역할에 대한 권한을 정의하고 적용하는 것입니다. 강화된 접근 제어는 권한이 없는 사용자가 민감한 데이터를 조회하거나 레코드를 수정하거나 관리 작업을 수행하는 것을 방지합니다. 이는 사용자 계정이 침해될 경우 피해 범위를 제한하는 효과도 있습니다. 공격자는 해당 계정의 권한 범위 내에서만 활동할 수 있기 때문입니다.
효과적인 접근 제어는 신원을 확인하기 위한 강력한 인증과, 인증된 사용자가 요청된 작업을 수행할 권한이 있는지 확인하는 권한 부여 제어를 필요로 합니다. 최소 권한 원칙에 부합하도록 접근 제어 관행을 정기적으로 검토하여 사용자에게 업무 수행에 필요한 최소한의 접근 권한만 부여해야 합니다. 접근 제어는 또한 정책과 시스템 사용자를 최신 상태로 유지하기 위한 정기적인 모니터링과, 비정상적인 활동을 신속하게 감지하는 감사에 기반합니다.
2. 데이터 검증 및 정제
데이터 검증 및 정리는 처리 전 모든 입력 데이터를 확인하여 예상되는 형식, 유형 및 패턴을 충족하는지 확인한 후, 잠재적으로 위험한 내용을 제거하기 위해 데이터를 정리하는 과정을 의미합니다. 이러한 관행은 신뢰할 수 있는 출처에서도 데이터가 손상될 수 있으므로 모든 외부 출처의 입력 데이터에 적용되어야 합니다. 따라서 각 입력은 검증될 때까지 신뢰할 수 없는 것으로 간주해야 합니다. 검증 및 정화 과정을 개발 프로세스에 통합함으로써, 주입 공격과 같은 일반적인 위협에 대한 애플리케이션의 복원력을 보장할 수 있습니다.
3. 현대적인 언어로 작성하십시오
안전한 코딩은 단순히 코드를 작성하는 방식에만 국한되지 않습니다. 이는 보안 취약점 유입을 더 쉽게 방지할 수 있는 도구와 환경을 선택하는 문제이기도 합니다. 비록 완전히 현대적인 언어로 전환하는 것이 많은 기업에게 현실적이거나 효율적인 선택이 아닌 경우가 많지만, 최소한 부분적으로 현대적인 프로그래밍 언어를 사용하고 선택한 모든 언어의 최신 버전을 활용하는 것은 소프트웨어 보안을 향상시킬 수 있습니다. 현대적인 언어와 프레임워크는 일반적으로 향상된 메모리 안전성, 강화된 타입 검사, 그리고 일반적인 취약점에 대한 내장된 보호 기능을 제공합니다. 예를 들어, Rust나 Go와 같은 언어들은 보안에 중점을 두고 설계되어, 구식 언어들이 더 취약할 수 있는 버퍼 오버플로우 같은 문제를 방지합니다.
Java나 Python과 같은 기존 언어는 현대화 및 보안 강화가 어려울 수 있지만, 최신 버전을 유지하면 최신 보안 기능과 성능 개선 사항을 활용할 수 있습니다. 많은 업데이트는 알려진 취약점을 수정하고, 위험한 기능을 비활성화하며, 보다 안전한 기본 설정을 제공합니다.
4. 실무 코드 난독화
코드 난독화는 공격자가 소스 코드나 컴파일된 코드를 이해하거나 역설계하거나 조작하기 어렵게 만드는 과정입니다. 다른 보안 조치를 대체하지는 않지만, 애플리케이션의 민감한 로직과 루틴을 외부 시선으로부터 숨김으로써 추가적인 방어 계층을 제공합니다. 난독화에는 변수 및 함수 이름을 의미 없는 식별자로 변경하거나, 코드 구조를 재구성하여 추적하기 어렵게 만드는 등의 기법이 포함될 수 있습니다.
목표는 공격자가 취약점을 탐지하고 악용하는 데 필요한 비용과 노력을 증가시키는 것입니다. 안전한 코딩에서 난독화는 다른 엄격한 보안 관행과 결합되어 애플리케이션을 덜 매력적인 표적으로 만듭니다.

5. 코드를 스캔하고 모니터링하세요
안전한 코딩 관행에는 코드를 적극적으로 스캔하고 모니터링하는 것도 포함됩니다. 애플리케이션 정적 보안 테스트(SAST) 도구는 배포 전에 알려진 취약점을 탐지하기 위해 소스 코드를 분석하는 반면, 애플리케이션 동적 보안 테스트(DAST) 도구는 실행 중인 애플리케이션을 테스트하여 실시간으로 악용 가능한 결함을 탐지합니다. 두 접근 방식을 결합하면 문제를 조기에 지속적으로 탐지할 수 있습니다.
개발 단계에서의 디지털화 외에도, 운영 환경에서 지속적인 모니터링을 구현하는 것이 필수적입니다. 이는 비정상적인 활동 발생 시 경보를 설정하고, 보안 이벤트를 기록하며, 실행 중인 애플리케이션의 자체 방어 도구(RASP)를 활용하여 실시간으로 공격을 탐지하고 차단하는 것을 의미합니다. 정기적인 분석과 모니터링을 통해 개발 과정에서 취약점이 발견되더라도 심각한 피해가 발생하기 전에 신속하게 대응할 수 있는 가시성을 확보할 수 있습니다.
6. 안전한 코딩 표준을 문서화하고 구현하기
보안 코딩 표준 문서화는 팀이 안전하고 유지보수 가능하며 규정을 준수하는 코드를 작성하는 방식을 정의하는 명확한 지침 세트를 만드는 것입니다. 이러한 표준은 입력 검증, 오류 처리, 암호화 관행, 세션 관리와 같은 주제를 다루어야 하며, 기술 인프라에 특화된 일반적인 취약점을 해결하는 방법도 포함해야 합니다.
이러한 표준의 도입은 신입 엔지니어부터 시니어 아키텍트에 이르기까지 모든 개발자가 동일한 보안 원칙을 따르도록 보장합니다. 정기적인 교육 및 업데이트와 결합될 때, 이러한 표준은 개발 프로세스를 최신 보안 요구사항에 부합하도록 유지하는 살아있는 자원이 됩니다.
보안 코딩 표준 및 프레임워크
자체 코딩 표준을 수립하는 데 도움이 필요하시다면, 아래의 널리 사용되는 가이드라인이 도움이 될 수 있습니다. 이 가이드라인들은 일반적인 취약점을 해결하기 위한 다양한 관행을 다루며, 코딩 작업을 업계 모범 사례에 부합하도록 조정하는 방법을 명확히 하는 데 기여할 수 있습니다.
OWASP 보안 코딩 관행
OWASP는 개발자가 코드 작성 초기부터 최종 단계까지 보안을 통합하고자 할 때 가장 널리 인정받는 정보원 중 하나입니다. OWASP 개발자 가이드와 OWASP Top 10과 같은 핵심 보안 코딩 리소스를 제공합니다. OWASP의 접근 방식은 실행 가능성이 매우 높으며, 개발 과정에서 적용할 수 있는 체크리스트와 코딩 지침을 제공합니다.
OWASP 지침을 준수하면 프로젝트 간 안전한 코딩을 위한 공통 기준을 마련함으로써 팀에 이점을 제공합니다. OWASP는 새로운 위협 벡터와 공격 기법을 반영하기 위해 정기적으로 업데이트되므로, 조직은 이를 활용하여 새롭게 등장하는 위험에 대비할 수 있습니다. OWASP 원칙을 워크플로우에 통합하면 코드 품질을 향상시키고 취약점을 줄이며 업계에서 널리 인정받는 지침을 준수하게 됩니다.

NIST 보안 소프트웨어 개발 프레임워크
미국 국립표준기술연구소(NIST)는 포괄적인 사이버보안 프레임워크와 함께 안전한 코딩에 관한 상세한 지침을 발표합니다. NIST의 안전한 소프트웨어 개발 프레임워크(SSDF) 는 안전한 소프트웨어 개발 관행에 대한 고수준 정보를 제공하는 것 외에도, 기업 내 팀 및 팀 간 핵심 사안에 대한 의사소통을 개선하는 공통 용어를 제시합니다. 이 프레임워크는 특정 기술보다 결과에 중점을 두므로 OWASP나 SEI CERT 코딩 표준과 같은 다른 표준과 함께 보완적으로 활용하는 것이 바람직합니다.
SEI CERT 코딩 규범
소프트웨어 공학 연구소(SEI)의 CERT 부서에서 개발한 SEI CERT 코딩 표준은 C, C++, Java, Perl 등 특정 프로그래밍 언어에서 보안 취약점을 방지하는 데 중점을 둡니다. 각 언어별 표준에는 안전한 코딩 규칙, 상세한 설명, 준수 및 비준수 코드 예시가 포함됩니다. CERT 코딩 표준은 특정 프로그래밍 언어의 미묘한 차이점과 특수성을 고려하므로, 해당 환경에서 작업하는 개발자들에게 매우 유용하고 실용적입니다.
Microsoft 보안 개발 주기
Microsoft의 보안 개발 수명주기(SDL)는 보안을 소프트웨어 개발 프로세스의 필수 요소로 만들기 위한 일련의 관행입니다. 이는 위협 모델링, 개발자 대상 보안 교육, 소프트웨어 공급망 보안 등 10가지 주요 주제에 대한 권장 사항을 포함합니다. 마이크로소프트 자체도 이 접근 방식을 활용하여 기업들이 검증된 프로세스를 통해 개발자, 테스터, 보안 팀 간의 협업을 강화할 수 있도록 지원합니다.
ISO/IEC 27001 표준
ISO/IEC 27001 표준은 주로 정보 보안 관리 시스템(ISMS)을 위한 표준으로 알려져 있지만, 안전한 코딩에도 중요한 함의를 지닙니다. 조직 차원의 ISMS 구축에 중점을 두지만, 안전한 코딩과 관련된 원칙을 포함하고 있습니다. 이러한 권고 사항은 조직이 안전한 코딩 관행을 구현할 때 따를 수 있는 상위 수준의 지침을 제공합니다.

인공지능 안전 규칙
AI 코딩 도구는 그 어느 때보다 편리해졌지만, 안전하고 정확한 코드를 보장하지 못할 경우 오히려 해가 될 수 있습니다. Secure Code Warrior AI 보안 규칙 — 최초의 가이드라인 — 은 GitHub Copilot, Cline, Cursor, Windsurf와 같은 AI 도구와 함께 사용할 수 있는 안전한 코딩 모범 사례에 대한 지침을 제공합니다. 이 규칙들은 AI 코딩 어시스턴트가 올바른 방향으로 나아가도록 하며, 안전하지 않은 코드 위험을 최소화하는 장벽을 구축합니다.
처음부터 안전한 코드를 만드는 방법을 알아보세요
안전한 코딩은 단순한 기술적 요구사항을 넘어 핵심적인 비즈니스 이점입니다. 팀이 처음부터 안전한 코드를 작성하면 비용이 많이 드는 취약점을 방지하고, 데이터 유출 위험을 줄이며, 고객에게 신뢰할 수 있는 소프트웨어를 제공할 수 있습니다. 그러나 체계적인 지침 없이는 안전한 코딩 관행을 숙달하는 것이 특히 어려울 수 있습니다. 개발자들은 구체적인 실천 방법, 진화하는 위협에 대한 최신 지식, 그리고 각 코드 라인에 안전 원칙을 자신 있게 적용할 수 있는 방법이 필요합니다.
ISO 27001 인증을 획득하고 SOC 2 표준을 준수하는 Secure Code Warrior 애자일 학습 플랫폼은 바로 이러한 역량을 팀에 제공합니다. 각 언어별 보안 모범 사례 교육, 현실적인 코딩 과제, 다양한 역할에 맞춰 설계된 콘텐츠를 통해 보안은 부차적인 문제가 아닌 개발 프로세스의 자연스러운 일부가 됩니다. 개발자들은 취약점을 신속하게 식별하고 수정하는 데 필요한 기술을 습득하며, 업계 표준에 부합하고 소프트웨어 개발 라이프사이클 전반에 걸쳐 코드 보안을 완전히 책임질 수 있게 됩니다. 따라서 Secure Code Warrior 사용하는 기업들이 소프트웨어 취약점을 53% Secure Code Warrior , 최대 1,400만 달러의 비용을 절감하며, 개발자의 92%가 추가 교육을 원한다는 사실은 놀라운 일이 아닙니다.
팀이 첫날부터 더 안전하고 효율적인 코드를 작성하는 방법을 확인하고 싶다면, 지금 Secure Code Warrior 데모를 예약하세요.
Secure Code Warrior fait du codage sécurisé une expérience positive et engageante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son parcours d'apprentissage préféré, afin que les développeurs doués pour la sécurité deviennent les super-héros du quotidien de notre monde connecté.

Secure Code Warrior 귀사의 조직이 소프트웨어 개발 주기 전반에 걸쳐 코드를 안전하게 보호하고 사이버보안이 최우선 과제인 문화를 조성하도록 Secure Code Warrior . 애플리케이션 보안 담당자, 개발자, IT 보안 책임자 또는 보안 관련 업무에 종사하는 모든 분들을 위해, 저희는 귀사의 조직이 안전하지 않은 코드로 인한 위험을 줄일 수 있도록 돕습니다.
데모 예약하기Secure Code Warrior fait du codage sécurisé une expérience positive et engageante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son parcours d'apprentissage préféré, afin que les développeurs doués pour la sécurité deviennent les super-héros du quotidien de notre monde connecté.
Cet article a été rédigé par l'équipe d'experts du secteur de Secure Code Warrior, qui s'est engagée à donner aux développeurs les connaissances et les compétences nécessaires pour créer des logiciels sécurisés dès le départ. S'appuyant sur une expertise approfondie en matière de pratiques de codage sécurisé, de tendances du secteur et de connaissances du monde réel.


소프트웨어 취약점이 부차적인 문제나 혁신의 장애물로 간주될 때, 기업들은 데이터 유출, 평판 손상 및 막대한 법적 책임에 노출됩니다. 사이버 공격은 종종 더 엄격한 개발 관행을 통해 방지할 수 있었던 코드의 취약점을 악용합니다.
안전한 코딩은 개발의 각 단계에 보안 원칙을 통합함으로써 이러한 과제를 해결합니다. 취약점이 발견된 후 패치를 적용하는 대신, 개발자는 인젝션 공격 및 크로스 사이트 스크립팅(XSS)과 같은 일반적인 위협에 대한 내장형 보호 기능을 갖춘 코드를 작성합니다. 보안 코딩이 어떻게 기업이 위험을 줄이고 사용자 신뢰를 유지하며 규제 요건을 준수하는 동시에 신뢰할 수 있고 고품질의 소프트웨어를 제공할 수 있는지 자세히 살펴보겠습니다.
보안 코딩이란 무엇인가요?
안전한 코딩은 소프트웨어 작성 시 잠재적 취약점을 수정하기 위해 보안 모범 사례를 따르는 원칙입니다. 보안을 개발 과정의 별도 단계로 취급하기보다는, 보안 코딩은 검증된 보호 조치를 초기 단계부터 통합하여 개발자가 코드 보안을 책임지고 효과적으로 적용할 수 있는 역량을 갖추도록 보장합니다.
오픈 월드와이드 애플리케이션 보안 프로젝트(OWASP)나 소프트웨어 엔지니어링 연구소의 CERT 부서와 같은 기관에서 생산하는 공인된 안전한 코딩 표준은 공격자들이 악용하는 일반적인 함정을 피하려는 개발자들에게 나침반 역할을 할 수 있습니다. 현재 사이버 보안 환경에서는 기존 워크플로우에 이러한 전략을 안전하게 구현하기 위해 안전한 코딩에 대한 기본적이고 실용적인 기술을 지속적으로 활용하는 것이 필수적입니다. 예를 들어, 최대한 많은 사용자 입력을 검증하면 SQL 인젝션 공격을 방지할 수 있으며, 출력 코딩을 통해 XSS를 차단할 수 있습니다. 이러한 안전한 코딩 관행은 침해 위험을 줄이고 진화하는 사이버 위협에 견딜 수 있는 더 탄력적인 애플리케이션을 구축하는 데 기여합니다.
보안 코딩이 왜 그렇게 중요한가?
보안 코딩은 중요합니다. 많은 성공적인 사이버 공격이 개발 과정에서 방지할 수 있었던 취약점을 악용하기 때문입니다. 초기 단계부터 보안 관행을 우선시함으로써 공격자가 데이터를 침해하거나 운영을 방해하는 데 이용할 수 있는 취약점이 도입될 가능성을 줄일 수 있습니다. 소프트웨어 개발 생명주기(SDLC)의 각 단계에 보안을 통합하면 모든 기능, 업데이트 및 통합이 보호를 고려하여 설계되도록 보장합니다.
개발 단계에서 위험을 선제적으로 처리하는 것은 배포 후 수정하는 것보다 훨씬 비용 효율적입니다. 배포 후 수정은 긴급 패치, 서비스 중단 및 사고 대응 자원이 필요할 수 있습니다. 또한 데이터 보호 규정 준수를 향상시켜 잠재적인 벌금 및 법적 문제를 방지합니다. 안전한 코딩 관행은 기업에 대한 소비자 신뢰를 강화하고 강화된 보안을 브랜드 평판에 통합합니다.
코드에 공통적으로 존재하는 보안 취약점
안전한 코딩은 공격자가 악용하는 가장 빈번하고 위험한 취약점과 AI 기반 코딩 도구 사용과 같은 신종 위협 경로를 방지하는 것을 목표로 합니다. 다음은 몇 가지 일반적인 취약점, 이들이 초래할 수 있는 피해, 그리고 안전한 코딩이 이를 완화하는 데 어떻게 기여할 수 있는지에 대한 개요입니다.

역직렬화 오류
디세리얼라이제이션 결함은 애플리케이션이 외부 출처의 데이터를 적절한 검증 없이 수신하고 처리할 때 발생합니다. 세리얼라이제이션은 객체를 저장하거나 전송 가능한 형식으로 변환하는 반면, 디세리얼라이제이션은 해당 객체를 재구성하여 사용 가능하게 합니다. 디세리얼라이제이션 결함의 영향은 심각할 수 있으며, 임의 코드 실행이나 권한 상승을 초래할 수 있습니다. 안전한 코딩은 신뢰할 수 있고 검증된 데이터만 디세리얼라이즈되도록 보장하고, 신뢰할 수 없는 입력에 대한 네이티브 디세리얼라이제이션을 가능한 한 피함으로써 이 문제를 해결합니다.
주입 공격
주입 공격은 공격자가 애플리케이션이 명령이나 쿼리의 일부로 해석하는 입력을 제공할 때 발생합니다. 가장 잘 알려진 유형은 SQL 주입으로, 악의적인 SQL 문이 쿼리에 삽입되어 데이터베이스 콘텐츠에 접근하거나 수정하는 것입니다. 다른 유형으로는 공격자가 임의의 명령을 실행하는 명령어 주입과 LDAP(경량 디렉터리 접근 프로토콜) 주입이 있습니다. 주입 공격의 결과는 무단 데이터 접근 및 삭제부터 시스템 전체 침해에 이르기까지 다양합니다. 개인 정보, 금융 정보 또는 기밀 정보가 포함된 데이터베이스는 주요 표적이 됩니다. 안전한 코딩은 매개변수화된 쿼리나 준비된 문 사용, 처리 전 신뢰할 수 없는 데이터 이스케이프 처리, 엄격한 입력 검증을 통해 인젝션 취약점을 방지합니다. 이러한 안전한 코딩 관행은 공격자가 애플리케이션의 예상 동작을 변경하는 것을 막을 수 있습니다.

크로스 사이트 스크립팅(XSS)
크로스 사이트 스크립팅(XSS) 은 웹 애플리케이션을 대상으로 하는 인젝션 공격의 한 형태로, 다른 사용자가 보는 페이지에 악성 스크립트를 삽입합니다. 이는 일반적으로 애플리케이션이 검증되지 않은 사용자 입력을 출력에 포함시킬 때 발생합니다. 다른 사용자의 브라우저가 해당 페이지를 표시하면 악성 스크립트가 실행되어 쿠키를 탈취하거나 키 입력을 가로채거나 사용자를 악성 사이트로 리디렉션할 수 있습니다.
XSS의 영향에는 세션 탈취 및 신원 도용이 포함될 수 있습니다. 기업에게는 고객 신뢰를 훼손하며, 민감한 데이터가 유출될 경우 규제적 결과를 초래할 수 있습니다. 안전한 코딩은 사용자가 제공한 모든 입력을 표시하기 전에 정제하고 인코딩하며, 출력을 자동으로 이스케이프하는 프레임워크를 사용하고, 실행 가능한 스크립트를 제한하기 위해 콘텐츠 보안 정책(CSP)을 구현함으로써 XSS를 해결합니다.
출입 통제
제어 관련 취약점은 사용자가 볼 수 있거나 수행할 수 있는 항목에 대한 규칙이 올바르게 정의되거나 적용되지 않을 때 발생합니다. 결함이 있는 접근 제어는 공격자가 의도된 사용자 역할 제한을 우회하여 잠재적으로 민감한 데이터를 읽거나, 레코드를 수정하거나, 특권 사용자만 수행할 수 있는 작업을 수행할 수 있게 합니다.
접근 제어 문제는 중대한 도전 과제이며, 특히 AI 코딩 도구는 이 취약점 유형을 효과적으로 처리하는 데 어려움을 겪어 왔습니다. 이는 개발자의 기술과 인식 제고의 필요성을 강조합니다. 접근 제어 위반의 영향은 상당합니다. 예를 들어, 공격자가 관리자 전용 기능에 접근할 수 있다면 보안 설정을 비활성화하거나, 개인 정보를 추출하거나, 다른 사용자로 위장할 수 있습니다.
안전한 코딩 관행은 최소 권한 원칙에 따라 각 요청에 대해 서버 측 권한 제어 기능을 적용하고, 보안 조치로서 링크 숨김과 같은 단순한 은폐에만 의존하지 않음으로써 이러한 위험을 방지합니다. 또한 엄격한 접근 제어 테스트를 수행함으로써 이러한 보호 장치가 장기적으로 견고하게 유지되도록 보장할 수 있습니다.

크로스 사이트 요청 위조(CSRF)
크로스 사이트 요청 위조(CSRF) 공격은 사용자가 인증된 다른 사이트에서 원치 않는 작업을 수행하도록 강요합니다. 이는 자금 이체, 이메일 주소 변경 또는 계정 설정 수정 등을 포함할 수 있습니다. 이 공격이 가능한 이유는 브라우저가 위조된 요청에 쿠키와 같은 유효한 인증 토큰을 자동으로 포함시키기 때문입니다.
안전한 코딩은 각 사용자 세션마다 고유한 CSRF 방지 토큰을 구현하고 상태 변경 요청 시마다 이를 검증함으로써 CSRF로부터 보호합니다. 추가 방어 수단으로는 중요한 작업에 대한 재인증 요구 및 쿠키의 SameSite 속성 설정을 통해 쿠키가 사이트 간 요청과 함께 전송되는 것을 방지하는 것이 포함됩니다. 이러한 보호 기능을 개발 라이프사이클에 통합함으로써 시스템이 합법적이고 의도된 작업만 처리할 가능성을 높일 수 있습니다.
비보안 인증
비보안 인증은 사용자의 신원 확인 절차가 취약하거나 예측 가능하거나 결함이 있을 때 발생합니다. 이는 불량한 비밀번호 정책, 보안되지 않은 자격 증명 저장, 또는 다중 요소 인증(MFA) 부재로 인해 발생할 수 있습니다. 공격자는 이러한 취약점을 다양한 방법으로 악용할 수 있습니다. 여기에는 무차별 대입 공격, 자격 증명 스푸핑, 전송 중인 암호화되지 않은 자격 증명 정보 가로채기 등이 포함됩니다. 비보안 인증의 영향은 심각합니다. 공격자에게 사용자 계정, 관리 권한, 민감한 데이터에 대한 직접적인 접근 권한을 제공할 수 있기 때문입니다. 일단 내부로 침투한 공격자는 시스템을 더욱 손상시키거나 귀중한 정보를 탈취할 수 있습니다.
보안 코딩은 엄격한 비밀번호 요구사항을 적용하고, 저장된 인증 정보를 해시 처리 및 분류하며, 모든 인증 교환에 HTTPS와 같은 보안 프로토콜을 사용하고, 추가 검증 계층을 제공하기 위해 MFA를 통합함으로써 이 취약점을 해결합니다. 개발자는 또한 실패한 시도 횟수를 제한하고 의심스러운 활동을 신속하게 탐지하는 로그인 메커니즘을 설계해야 합니다. 이를 통해 인증 시스템이 취약점이 아닌 견고한 방어선 역할을 할 수 있도록 해야 합니다.
안전한 코딩을 위한 6가지 실천 방법
안전한 소프트웨어 개발은 기존 위협을 아는 데 그치지 않습니다. 검증된 안전한 코딩 관행과 패턴을 학습하고 적용해야 합니다. 아래 기술들은 개발자가 각 프로젝트에 보안을 통합하기 위해 취할 수 있는 구체적인 조치들을 제시합니다.
1. 사용자 접근 제어 구현
위에서 언급한 바와 같이, 사용자 접근 제어는 시스템 내 각 사용자 역할에 대한 권한을 정의하고 적용하는 것입니다. 강화된 접근 제어는 권한이 없는 사용자가 민감한 데이터를 조회하거나 레코드를 수정하거나 관리 작업을 수행하는 것을 방지합니다. 이는 사용자 계정이 침해될 경우 피해 범위를 제한하는 효과도 있습니다. 공격자는 해당 계정의 권한 범위 내에서만 활동할 수 있기 때문입니다.
효과적인 접근 제어는 신원을 확인하기 위한 강력한 인증과, 인증된 사용자가 요청된 작업을 수행할 권한이 있는지 확인하는 권한 부여 제어를 필요로 합니다. 최소 권한 원칙에 부합하도록 접근 제어 관행을 정기적으로 검토하여 사용자에게 업무 수행에 필요한 최소한의 접근 권한만 부여해야 합니다. 접근 제어는 또한 정책과 시스템 사용자를 최신 상태로 유지하기 위한 정기적인 모니터링과, 비정상적인 활동을 신속하게 감지하는 감사에 기반합니다.
2. 데이터 검증 및 정제
데이터 검증 및 정리는 처리 전 모든 입력 데이터를 확인하여 예상되는 형식, 유형 및 패턴을 충족하는지 확인한 후, 잠재적으로 위험한 내용을 제거하기 위해 데이터를 정리하는 과정을 의미합니다. 이러한 관행은 신뢰할 수 있는 출처에서도 데이터가 손상될 수 있으므로 모든 외부 출처의 입력 데이터에 적용되어야 합니다. 따라서 각 입력은 검증될 때까지 신뢰할 수 없는 것으로 간주해야 합니다. 검증 및 정화 과정을 개발 프로세스에 통합함으로써, 주입 공격과 같은 일반적인 위협에 대한 애플리케이션의 복원력을 보장할 수 있습니다.
3. 현대적인 언어로 작성하십시오
안전한 코딩은 단순히 코드를 작성하는 방식에만 국한되지 않습니다. 이는 보안 취약점 유입을 더 쉽게 방지할 수 있는 도구와 환경을 선택하는 문제이기도 합니다. 비록 완전히 현대적인 언어로 전환하는 것이 많은 기업에게 현실적이거나 효율적인 선택이 아닌 경우가 많지만, 최소한 부분적으로 현대적인 프로그래밍 언어를 사용하고 선택한 모든 언어의 최신 버전을 활용하는 것은 소프트웨어 보안을 향상시킬 수 있습니다. 현대적인 언어와 프레임워크는 일반적으로 향상된 메모리 안전성, 강화된 타입 검사, 그리고 일반적인 취약점에 대한 내장된 보호 기능을 제공합니다. 예를 들어, Rust나 Go와 같은 언어들은 보안에 중점을 두고 설계되어, 구식 언어들이 더 취약할 수 있는 버퍼 오버플로우 같은 문제를 방지합니다.
Java나 Python과 같은 기존 언어는 현대화 및 보안 강화가 어려울 수 있지만, 최신 버전을 유지하면 최신 보안 기능과 성능 개선 사항을 활용할 수 있습니다. 많은 업데이트는 알려진 취약점을 수정하고, 위험한 기능을 비활성화하며, 보다 안전한 기본 설정을 제공합니다.
4. 실무 코드 난독화
코드 난독화는 공격자가 소스 코드나 컴파일된 코드를 이해하거나 역설계하거나 조작하기 어렵게 만드는 과정입니다. 다른 보안 조치를 대체하지는 않지만, 애플리케이션의 민감한 로직과 루틴을 외부 시선으로부터 숨김으로써 추가적인 방어 계층을 제공합니다. 난독화에는 변수 및 함수 이름을 의미 없는 식별자로 변경하거나, 코드 구조를 재구성하여 추적하기 어렵게 만드는 등의 기법이 포함될 수 있습니다.
목표는 공격자가 취약점을 탐지하고 악용하는 데 필요한 비용과 노력을 증가시키는 것입니다. 안전한 코딩에서 난독화는 다른 엄격한 보안 관행과 결합되어 애플리케이션을 덜 매력적인 표적으로 만듭니다.

5. 코드를 스캔하고 모니터링하세요
안전한 코딩 관행에는 코드를 적극적으로 스캔하고 모니터링하는 것도 포함됩니다. 애플리케이션 정적 보안 테스트(SAST) 도구는 배포 전에 알려진 취약점을 탐지하기 위해 소스 코드를 분석하는 반면, 애플리케이션 동적 보안 테스트(DAST) 도구는 실행 중인 애플리케이션을 테스트하여 실시간으로 악용 가능한 결함을 탐지합니다. 두 접근 방식을 결합하면 문제를 조기에 지속적으로 탐지할 수 있습니다.
개발 단계에서의 디지털화 외에도, 운영 환경에서 지속적인 모니터링을 구현하는 것이 필수적입니다. 이는 비정상적인 활동 발생 시 경보를 설정하고, 보안 이벤트를 기록하며, 실행 중인 애플리케이션의 자체 방어 도구(RASP)를 활용하여 실시간으로 공격을 탐지하고 차단하는 것을 의미합니다. 정기적인 분석과 모니터링을 통해 개발 과정에서 취약점이 발견되더라도 심각한 피해가 발생하기 전에 신속하게 대응할 수 있는 가시성을 확보할 수 있습니다.
6. 안전한 코딩 표준을 문서화하고 구현하기
보안 코딩 표준 문서화는 팀이 안전하고 유지보수 가능하며 규정을 준수하는 코드를 작성하는 방식을 정의하는 명확한 지침 세트를 만드는 것입니다. 이러한 표준은 입력 검증, 오류 처리, 암호화 관행, 세션 관리와 같은 주제를 다루어야 하며, 기술 인프라에 특화된 일반적인 취약점을 해결하는 방법도 포함해야 합니다.
이러한 표준의 도입은 신입 엔지니어부터 시니어 아키텍트에 이르기까지 모든 개발자가 동일한 보안 원칙을 따르도록 보장합니다. 정기적인 교육 및 업데이트와 결합될 때, 이러한 표준은 개발 프로세스를 최신 보안 요구사항에 부합하도록 유지하는 살아있는 자원이 됩니다.
보안 코딩 표준 및 프레임워크
자체 코딩 표준을 수립하는 데 도움이 필요하시다면, 아래의 널리 사용되는 가이드라인이 도움이 될 수 있습니다. 이 가이드라인들은 일반적인 취약점을 해결하기 위한 다양한 관행을 다루며, 코딩 작업을 업계 모범 사례에 부합하도록 조정하는 방법을 명확히 하는 데 기여할 수 있습니다.
OWASP 보안 코딩 관행
OWASP는 개발자가 코드 작성 초기부터 최종 단계까지 보안을 통합하고자 할 때 가장 널리 인정받는 정보원 중 하나입니다. OWASP 개발자 가이드와 OWASP Top 10과 같은 핵심 보안 코딩 리소스를 제공합니다. OWASP의 접근 방식은 실행 가능성이 매우 높으며, 개발 과정에서 적용할 수 있는 체크리스트와 코딩 지침을 제공합니다.
OWASP 지침을 준수하면 프로젝트 간 안전한 코딩을 위한 공통 기준을 마련함으로써 팀에 이점을 제공합니다. OWASP는 새로운 위협 벡터와 공격 기법을 반영하기 위해 정기적으로 업데이트되므로, 조직은 이를 활용하여 새롭게 등장하는 위험에 대비할 수 있습니다. OWASP 원칙을 워크플로우에 통합하면 코드 품질을 향상시키고 취약점을 줄이며 업계에서 널리 인정받는 지침을 준수하게 됩니다.

NIST 보안 소프트웨어 개발 프레임워크
미국 국립표준기술연구소(NIST)는 포괄적인 사이버보안 프레임워크와 함께 안전한 코딩에 관한 상세한 지침을 발표합니다. NIST의 안전한 소프트웨어 개발 프레임워크(SSDF) 는 안전한 소프트웨어 개발 관행에 대한 고수준 정보를 제공하는 것 외에도, 기업 내 팀 및 팀 간 핵심 사안에 대한 의사소통을 개선하는 공통 용어를 제시합니다. 이 프레임워크는 특정 기술보다 결과에 중점을 두므로 OWASP나 SEI CERT 코딩 표준과 같은 다른 표준과 함께 보완적으로 활용하는 것이 바람직합니다.
SEI CERT 코딩 규범
소프트웨어 공학 연구소(SEI)의 CERT 부서에서 개발한 SEI CERT 코딩 표준은 C, C++, Java, Perl 등 특정 프로그래밍 언어에서 보안 취약점을 방지하는 데 중점을 둡니다. 각 언어별 표준에는 안전한 코딩 규칙, 상세한 설명, 준수 및 비준수 코드 예시가 포함됩니다. CERT 코딩 표준은 특정 프로그래밍 언어의 미묘한 차이점과 특수성을 고려하므로, 해당 환경에서 작업하는 개발자들에게 매우 유용하고 실용적입니다.
Microsoft 보안 개발 주기
Microsoft의 보안 개발 수명주기(SDL)는 보안을 소프트웨어 개발 프로세스의 필수 요소로 만들기 위한 일련의 관행입니다. 이는 위협 모델링, 개발자 대상 보안 교육, 소프트웨어 공급망 보안 등 10가지 주요 주제에 대한 권장 사항을 포함합니다. 마이크로소프트 자체도 이 접근 방식을 활용하여 기업들이 검증된 프로세스를 통해 개발자, 테스터, 보안 팀 간의 협업을 강화할 수 있도록 지원합니다.
ISO/IEC 27001 표준
ISO/IEC 27001 표준은 주로 정보 보안 관리 시스템(ISMS)을 위한 표준으로 알려져 있지만, 안전한 코딩에도 중요한 함의를 지닙니다. 조직 차원의 ISMS 구축에 중점을 두지만, 안전한 코딩과 관련된 원칙을 포함하고 있습니다. 이러한 권고 사항은 조직이 안전한 코딩 관행을 구현할 때 따를 수 있는 상위 수준의 지침을 제공합니다.

인공지능 안전 규칙
AI 코딩 도구는 그 어느 때보다 편리해졌지만, 안전하고 정확한 코드를 보장하지 못할 경우 오히려 해가 될 수 있습니다. Secure Code Warrior AI 보안 규칙 — 최초의 가이드라인 — 은 GitHub Copilot, Cline, Cursor, Windsurf와 같은 AI 도구와 함께 사용할 수 있는 안전한 코딩 모범 사례에 대한 지침을 제공합니다. 이 규칙들은 AI 코딩 어시스턴트가 올바른 방향으로 나아가도록 하며, 안전하지 않은 코드 위험을 최소화하는 장벽을 구축합니다.
처음부터 안전한 코드를 만드는 방법을 알아보세요
안전한 코딩은 단순한 기술적 요구사항을 넘어 핵심적인 비즈니스 이점입니다. 팀이 처음부터 안전한 코드를 작성하면 비용이 많이 드는 취약점을 방지하고, 데이터 유출 위험을 줄이며, 고객에게 신뢰할 수 있는 소프트웨어를 제공할 수 있습니다. 그러나 체계적인 지침 없이는 안전한 코딩 관행을 숙달하는 것이 특히 어려울 수 있습니다. 개발자들은 구체적인 실천 방법, 진화하는 위협에 대한 최신 지식, 그리고 각 코드 라인에 안전 원칙을 자신 있게 적용할 수 있는 방법이 필요합니다.
ISO 27001 인증을 획득하고 SOC 2 표준을 준수하는 Secure Code Warrior 애자일 학습 플랫폼은 바로 이러한 역량을 팀에 제공합니다. 각 언어별 보안 모범 사례 교육, 현실적인 코딩 과제, 다양한 역할에 맞춰 설계된 콘텐츠를 통해 보안은 부차적인 문제가 아닌 개발 프로세스의 자연스러운 일부가 됩니다. 개발자들은 취약점을 신속하게 식별하고 수정하는 데 필요한 기술을 습득하며, 업계 표준에 부합하고 소프트웨어 개발 라이프사이클 전반에 걸쳐 코드 보안을 완전히 책임질 수 있게 됩니다. 따라서 Secure Code Warrior 사용하는 기업들이 소프트웨어 취약점을 53% Secure Code Warrior , 최대 1,400만 달러의 비용을 절감하며, 개발자의 92%가 추가 교육을 원한다는 사실은 놀라운 일이 아닙니다.
팀이 첫날부터 더 안전하고 효율적인 코드를 작성하는 방법을 확인하고 싶다면, 지금 Secure Code Warrior 데모를 예약하세요.

소프트웨어 취약점이 부차적인 문제나 혁신의 장애물로 간주될 때, 기업들은 데이터 유출, 평판 손상 및 막대한 법적 책임에 노출됩니다. 사이버 공격은 종종 더 엄격한 개발 관행을 통해 방지할 수 있었던 코드의 취약점을 악용합니다.
안전한 코딩은 개발의 각 단계에 보안 원칙을 통합함으로써 이러한 과제를 해결합니다. 취약점이 발견된 후 패치를 적용하는 대신, 개발자는 인젝션 공격 및 크로스 사이트 스크립팅(XSS)과 같은 일반적인 위협에 대한 내장형 보호 기능을 갖춘 코드를 작성합니다. 보안 코딩이 어떻게 기업이 위험을 줄이고 사용자 신뢰를 유지하며 규제 요건을 준수하는 동시에 신뢰할 수 있고 고품질의 소프트웨어를 제공할 수 있는지 자세히 살펴보겠습니다.
보안 코딩이란 무엇인가요?
안전한 코딩은 소프트웨어 작성 시 잠재적 취약점을 수정하기 위해 보안 모범 사례를 따르는 원칙입니다. 보안을 개발 과정의 별도 단계로 취급하기보다는, 보안 코딩은 검증된 보호 조치를 초기 단계부터 통합하여 개발자가 코드 보안을 책임지고 효과적으로 적용할 수 있는 역량을 갖추도록 보장합니다.
오픈 월드와이드 애플리케이션 보안 프로젝트(OWASP)나 소프트웨어 엔지니어링 연구소의 CERT 부서와 같은 기관에서 생산하는 공인된 안전한 코딩 표준은 공격자들이 악용하는 일반적인 함정을 피하려는 개발자들에게 나침반 역할을 할 수 있습니다. 현재 사이버 보안 환경에서는 기존 워크플로우에 이러한 전략을 안전하게 구현하기 위해 안전한 코딩에 대한 기본적이고 실용적인 기술을 지속적으로 활용하는 것이 필수적입니다. 예를 들어, 최대한 많은 사용자 입력을 검증하면 SQL 인젝션 공격을 방지할 수 있으며, 출력 코딩을 통해 XSS를 차단할 수 있습니다. 이러한 안전한 코딩 관행은 침해 위험을 줄이고 진화하는 사이버 위협에 견딜 수 있는 더 탄력적인 애플리케이션을 구축하는 데 기여합니다.
보안 코딩이 왜 그렇게 중요한가?
보안 코딩은 중요합니다. 많은 성공적인 사이버 공격이 개발 과정에서 방지할 수 있었던 취약점을 악용하기 때문입니다. 초기 단계부터 보안 관행을 우선시함으로써 공격자가 데이터를 침해하거나 운영을 방해하는 데 이용할 수 있는 취약점이 도입될 가능성을 줄일 수 있습니다. 소프트웨어 개발 생명주기(SDLC)의 각 단계에 보안을 통합하면 모든 기능, 업데이트 및 통합이 보호를 고려하여 설계되도록 보장합니다.
개발 단계에서 위험을 선제적으로 처리하는 것은 배포 후 수정하는 것보다 훨씬 비용 효율적입니다. 배포 후 수정은 긴급 패치, 서비스 중단 및 사고 대응 자원이 필요할 수 있습니다. 또한 데이터 보호 규정 준수를 향상시켜 잠재적인 벌금 및 법적 문제를 방지합니다. 안전한 코딩 관행은 기업에 대한 소비자 신뢰를 강화하고 강화된 보안을 브랜드 평판에 통합합니다.
코드에 공통적으로 존재하는 보안 취약점
안전한 코딩은 공격자가 악용하는 가장 빈번하고 위험한 취약점과 AI 기반 코딩 도구 사용과 같은 신종 위협 경로를 방지하는 것을 목표로 합니다. 다음은 몇 가지 일반적인 취약점, 이들이 초래할 수 있는 피해, 그리고 안전한 코딩이 이를 완화하는 데 어떻게 기여할 수 있는지에 대한 개요입니다.

역직렬화 오류
디세리얼라이제이션 결함은 애플리케이션이 외부 출처의 데이터를 적절한 검증 없이 수신하고 처리할 때 발생합니다. 세리얼라이제이션은 객체를 저장하거나 전송 가능한 형식으로 변환하는 반면, 디세리얼라이제이션은 해당 객체를 재구성하여 사용 가능하게 합니다. 디세리얼라이제이션 결함의 영향은 심각할 수 있으며, 임의 코드 실행이나 권한 상승을 초래할 수 있습니다. 안전한 코딩은 신뢰할 수 있고 검증된 데이터만 디세리얼라이즈되도록 보장하고, 신뢰할 수 없는 입력에 대한 네이티브 디세리얼라이제이션을 가능한 한 피함으로써 이 문제를 해결합니다.
주입 공격
주입 공격은 공격자가 애플리케이션이 명령이나 쿼리의 일부로 해석하는 입력을 제공할 때 발생합니다. 가장 잘 알려진 유형은 SQL 주입으로, 악의적인 SQL 문이 쿼리에 삽입되어 데이터베이스 콘텐츠에 접근하거나 수정하는 것입니다. 다른 유형으로는 공격자가 임의의 명령을 실행하는 명령어 주입과 LDAP(경량 디렉터리 접근 프로토콜) 주입이 있습니다. 주입 공격의 결과는 무단 데이터 접근 및 삭제부터 시스템 전체 침해에 이르기까지 다양합니다. 개인 정보, 금융 정보 또는 기밀 정보가 포함된 데이터베이스는 주요 표적이 됩니다. 안전한 코딩은 매개변수화된 쿼리나 준비된 문 사용, 처리 전 신뢰할 수 없는 데이터 이스케이프 처리, 엄격한 입력 검증을 통해 인젝션 취약점을 방지합니다. 이러한 안전한 코딩 관행은 공격자가 애플리케이션의 예상 동작을 변경하는 것을 막을 수 있습니다.

크로스 사이트 스크립팅(XSS)
크로스 사이트 스크립팅(XSS) 은 웹 애플리케이션을 대상으로 하는 인젝션 공격의 한 형태로, 다른 사용자가 보는 페이지에 악성 스크립트를 삽입합니다. 이는 일반적으로 애플리케이션이 검증되지 않은 사용자 입력을 출력에 포함시킬 때 발생합니다. 다른 사용자의 브라우저가 해당 페이지를 표시하면 악성 스크립트가 실행되어 쿠키를 탈취하거나 키 입력을 가로채거나 사용자를 악성 사이트로 리디렉션할 수 있습니다.
XSS의 영향에는 세션 탈취 및 신원 도용이 포함될 수 있습니다. 기업에게는 고객 신뢰를 훼손하며, 민감한 데이터가 유출될 경우 규제적 결과를 초래할 수 있습니다. 안전한 코딩은 사용자가 제공한 모든 입력을 표시하기 전에 정제하고 인코딩하며, 출력을 자동으로 이스케이프하는 프레임워크를 사용하고, 실행 가능한 스크립트를 제한하기 위해 콘텐츠 보안 정책(CSP)을 구현함으로써 XSS를 해결합니다.
출입 통제
제어 관련 취약점은 사용자가 볼 수 있거나 수행할 수 있는 항목에 대한 규칙이 올바르게 정의되거나 적용되지 않을 때 발생합니다. 결함이 있는 접근 제어는 공격자가 의도된 사용자 역할 제한을 우회하여 잠재적으로 민감한 데이터를 읽거나, 레코드를 수정하거나, 특권 사용자만 수행할 수 있는 작업을 수행할 수 있게 합니다.
접근 제어 문제는 중대한 도전 과제이며, 특히 AI 코딩 도구는 이 취약점 유형을 효과적으로 처리하는 데 어려움을 겪어 왔습니다. 이는 개발자의 기술과 인식 제고의 필요성을 강조합니다. 접근 제어 위반의 영향은 상당합니다. 예를 들어, 공격자가 관리자 전용 기능에 접근할 수 있다면 보안 설정을 비활성화하거나, 개인 정보를 추출하거나, 다른 사용자로 위장할 수 있습니다.
안전한 코딩 관행은 최소 권한 원칙에 따라 각 요청에 대해 서버 측 권한 제어 기능을 적용하고, 보안 조치로서 링크 숨김과 같은 단순한 은폐에만 의존하지 않음으로써 이러한 위험을 방지합니다. 또한 엄격한 접근 제어 테스트를 수행함으로써 이러한 보호 장치가 장기적으로 견고하게 유지되도록 보장할 수 있습니다.

크로스 사이트 요청 위조(CSRF)
크로스 사이트 요청 위조(CSRF) 공격은 사용자가 인증된 다른 사이트에서 원치 않는 작업을 수행하도록 강요합니다. 이는 자금 이체, 이메일 주소 변경 또는 계정 설정 수정 등을 포함할 수 있습니다. 이 공격이 가능한 이유는 브라우저가 위조된 요청에 쿠키와 같은 유효한 인증 토큰을 자동으로 포함시키기 때문입니다.
안전한 코딩은 각 사용자 세션마다 고유한 CSRF 방지 토큰을 구현하고 상태 변경 요청 시마다 이를 검증함으로써 CSRF로부터 보호합니다. 추가 방어 수단으로는 중요한 작업에 대한 재인증 요구 및 쿠키의 SameSite 속성 설정을 통해 쿠키가 사이트 간 요청과 함께 전송되는 것을 방지하는 것이 포함됩니다. 이러한 보호 기능을 개발 라이프사이클에 통합함으로써 시스템이 합법적이고 의도된 작업만 처리할 가능성을 높일 수 있습니다.
비보안 인증
비보안 인증은 사용자의 신원 확인 절차가 취약하거나 예측 가능하거나 결함이 있을 때 발생합니다. 이는 불량한 비밀번호 정책, 보안되지 않은 자격 증명 저장, 또는 다중 요소 인증(MFA) 부재로 인해 발생할 수 있습니다. 공격자는 이러한 취약점을 다양한 방법으로 악용할 수 있습니다. 여기에는 무차별 대입 공격, 자격 증명 스푸핑, 전송 중인 암호화되지 않은 자격 증명 정보 가로채기 등이 포함됩니다. 비보안 인증의 영향은 심각합니다. 공격자에게 사용자 계정, 관리 권한, 민감한 데이터에 대한 직접적인 접근 권한을 제공할 수 있기 때문입니다. 일단 내부로 침투한 공격자는 시스템을 더욱 손상시키거나 귀중한 정보를 탈취할 수 있습니다.
보안 코딩은 엄격한 비밀번호 요구사항을 적용하고, 저장된 인증 정보를 해시 처리 및 분류하며, 모든 인증 교환에 HTTPS와 같은 보안 프로토콜을 사용하고, 추가 검증 계층을 제공하기 위해 MFA를 통합함으로써 이 취약점을 해결합니다. 개발자는 또한 실패한 시도 횟수를 제한하고 의심스러운 활동을 신속하게 탐지하는 로그인 메커니즘을 설계해야 합니다. 이를 통해 인증 시스템이 취약점이 아닌 견고한 방어선 역할을 할 수 있도록 해야 합니다.
안전한 코딩을 위한 6가지 실천 방법
안전한 소프트웨어 개발은 기존 위협을 아는 데 그치지 않습니다. 검증된 안전한 코딩 관행과 패턴을 학습하고 적용해야 합니다. 아래 기술들은 개발자가 각 프로젝트에 보안을 통합하기 위해 취할 수 있는 구체적인 조치들을 제시합니다.
1. 사용자 접근 제어 구현
위에서 언급한 바와 같이, 사용자 접근 제어는 시스템 내 각 사용자 역할에 대한 권한을 정의하고 적용하는 것입니다. 강화된 접근 제어는 권한이 없는 사용자가 민감한 데이터를 조회하거나 레코드를 수정하거나 관리 작업을 수행하는 것을 방지합니다. 이는 사용자 계정이 침해될 경우 피해 범위를 제한하는 효과도 있습니다. 공격자는 해당 계정의 권한 범위 내에서만 활동할 수 있기 때문입니다.
효과적인 접근 제어는 신원을 확인하기 위한 강력한 인증과, 인증된 사용자가 요청된 작업을 수행할 권한이 있는지 확인하는 권한 부여 제어를 필요로 합니다. 최소 권한 원칙에 부합하도록 접근 제어 관행을 정기적으로 검토하여 사용자에게 업무 수행에 필요한 최소한의 접근 권한만 부여해야 합니다. 접근 제어는 또한 정책과 시스템 사용자를 최신 상태로 유지하기 위한 정기적인 모니터링과, 비정상적인 활동을 신속하게 감지하는 감사에 기반합니다.
2. 데이터 검증 및 정제
데이터 검증 및 정리는 처리 전 모든 입력 데이터를 확인하여 예상되는 형식, 유형 및 패턴을 충족하는지 확인한 후, 잠재적으로 위험한 내용을 제거하기 위해 데이터를 정리하는 과정을 의미합니다. 이러한 관행은 신뢰할 수 있는 출처에서도 데이터가 손상될 수 있으므로 모든 외부 출처의 입력 데이터에 적용되어야 합니다. 따라서 각 입력은 검증될 때까지 신뢰할 수 없는 것으로 간주해야 합니다. 검증 및 정화 과정을 개발 프로세스에 통합함으로써, 주입 공격과 같은 일반적인 위협에 대한 애플리케이션의 복원력을 보장할 수 있습니다.
3. 현대적인 언어로 작성하십시오
안전한 코딩은 단순히 코드를 작성하는 방식에만 국한되지 않습니다. 이는 보안 취약점 유입을 더 쉽게 방지할 수 있는 도구와 환경을 선택하는 문제이기도 합니다. 비록 완전히 현대적인 언어로 전환하는 것이 많은 기업에게 현실적이거나 효율적인 선택이 아닌 경우가 많지만, 최소한 부분적으로 현대적인 프로그래밍 언어를 사용하고 선택한 모든 언어의 최신 버전을 활용하는 것은 소프트웨어 보안을 향상시킬 수 있습니다. 현대적인 언어와 프레임워크는 일반적으로 향상된 메모리 안전성, 강화된 타입 검사, 그리고 일반적인 취약점에 대한 내장된 보호 기능을 제공합니다. 예를 들어, Rust나 Go와 같은 언어들은 보안에 중점을 두고 설계되어, 구식 언어들이 더 취약할 수 있는 버퍼 오버플로우 같은 문제를 방지합니다.
Java나 Python과 같은 기존 언어는 현대화 및 보안 강화가 어려울 수 있지만, 최신 버전을 유지하면 최신 보안 기능과 성능 개선 사항을 활용할 수 있습니다. 많은 업데이트는 알려진 취약점을 수정하고, 위험한 기능을 비활성화하며, 보다 안전한 기본 설정을 제공합니다.
4. 실무 코드 난독화
코드 난독화는 공격자가 소스 코드나 컴파일된 코드를 이해하거나 역설계하거나 조작하기 어렵게 만드는 과정입니다. 다른 보안 조치를 대체하지는 않지만, 애플리케이션의 민감한 로직과 루틴을 외부 시선으로부터 숨김으로써 추가적인 방어 계층을 제공합니다. 난독화에는 변수 및 함수 이름을 의미 없는 식별자로 변경하거나, 코드 구조를 재구성하여 추적하기 어렵게 만드는 등의 기법이 포함될 수 있습니다.
목표는 공격자가 취약점을 탐지하고 악용하는 데 필요한 비용과 노력을 증가시키는 것입니다. 안전한 코딩에서 난독화는 다른 엄격한 보안 관행과 결합되어 애플리케이션을 덜 매력적인 표적으로 만듭니다.

5. 코드를 스캔하고 모니터링하세요
안전한 코딩 관행에는 코드를 적극적으로 스캔하고 모니터링하는 것도 포함됩니다. 애플리케이션 정적 보안 테스트(SAST) 도구는 배포 전에 알려진 취약점을 탐지하기 위해 소스 코드를 분석하는 반면, 애플리케이션 동적 보안 테스트(DAST) 도구는 실행 중인 애플리케이션을 테스트하여 실시간으로 악용 가능한 결함을 탐지합니다. 두 접근 방식을 결합하면 문제를 조기에 지속적으로 탐지할 수 있습니다.
개발 단계에서의 디지털화 외에도, 운영 환경에서 지속적인 모니터링을 구현하는 것이 필수적입니다. 이는 비정상적인 활동 발생 시 경보를 설정하고, 보안 이벤트를 기록하며, 실행 중인 애플리케이션의 자체 방어 도구(RASP)를 활용하여 실시간으로 공격을 탐지하고 차단하는 것을 의미합니다. 정기적인 분석과 모니터링을 통해 개발 과정에서 취약점이 발견되더라도 심각한 피해가 발생하기 전에 신속하게 대응할 수 있는 가시성을 확보할 수 있습니다.
6. 안전한 코딩 표준을 문서화하고 구현하기
보안 코딩 표준 문서화는 팀이 안전하고 유지보수 가능하며 규정을 준수하는 코드를 작성하는 방식을 정의하는 명확한 지침 세트를 만드는 것입니다. 이러한 표준은 입력 검증, 오류 처리, 암호화 관행, 세션 관리와 같은 주제를 다루어야 하며, 기술 인프라에 특화된 일반적인 취약점을 해결하는 방법도 포함해야 합니다.
이러한 표준의 도입은 신입 엔지니어부터 시니어 아키텍트에 이르기까지 모든 개발자가 동일한 보안 원칙을 따르도록 보장합니다. 정기적인 교육 및 업데이트와 결합될 때, 이러한 표준은 개발 프로세스를 최신 보안 요구사항에 부합하도록 유지하는 살아있는 자원이 됩니다.
보안 코딩 표준 및 프레임워크
자체 코딩 표준을 수립하는 데 도움이 필요하시다면, 아래의 널리 사용되는 가이드라인이 도움이 될 수 있습니다. 이 가이드라인들은 일반적인 취약점을 해결하기 위한 다양한 관행을 다루며, 코딩 작업을 업계 모범 사례에 부합하도록 조정하는 방법을 명확히 하는 데 기여할 수 있습니다.
OWASP 보안 코딩 관행
OWASP는 개발자가 코드 작성 초기부터 최종 단계까지 보안을 통합하고자 할 때 가장 널리 인정받는 정보원 중 하나입니다. OWASP 개발자 가이드와 OWASP Top 10과 같은 핵심 보안 코딩 리소스를 제공합니다. OWASP의 접근 방식은 실행 가능성이 매우 높으며, 개발 과정에서 적용할 수 있는 체크리스트와 코딩 지침을 제공합니다.
OWASP 지침을 준수하면 프로젝트 간 안전한 코딩을 위한 공통 기준을 마련함으로써 팀에 이점을 제공합니다. OWASP는 새로운 위협 벡터와 공격 기법을 반영하기 위해 정기적으로 업데이트되므로, 조직은 이를 활용하여 새롭게 등장하는 위험에 대비할 수 있습니다. OWASP 원칙을 워크플로우에 통합하면 코드 품질을 향상시키고 취약점을 줄이며 업계에서 널리 인정받는 지침을 준수하게 됩니다.

NIST 보안 소프트웨어 개발 프레임워크
미국 국립표준기술연구소(NIST)는 포괄적인 사이버보안 프레임워크와 함께 안전한 코딩에 관한 상세한 지침을 발표합니다. NIST의 안전한 소프트웨어 개발 프레임워크(SSDF) 는 안전한 소프트웨어 개발 관행에 대한 고수준 정보를 제공하는 것 외에도, 기업 내 팀 및 팀 간 핵심 사안에 대한 의사소통을 개선하는 공통 용어를 제시합니다. 이 프레임워크는 특정 기술보다 결과에 중점을 두므로 OWASP나 SEI CERT 코딩 표준과 같은 다른 표준과 함께 보완적으로 활용하는 것이 바람직합니다.
SEI CERT 코딩 규범
소프트웨어 공학 연구소(SEI)의 CERT 부서에서 개발한 SEI CERT 코딩 표준은 C, C++, Java, Perl 등 특정 프로그래밍 언어에서 보안 취약점을 방지하는 데 중점을 둡니다. 각 언어별 표준에는 안전한 코딩 규칙, 상세한 설명, 준수 및 비준수 코드 예시가 포함됩니다. CERT 코딩 표준은 특정 프로그래밍 언어의 미묘한 차이점과 특수성을 고려하므로, 해당 환경에서 작업하는 개발자들에게 매우 유용하고 실용적입니다.
Microsoft 보안 개발 주기
Microsoft의 보안 개발 수명주기(SDL)는 보안을 소프트웨어 개발 프로세스의 필수 요소로 만들기 위한 일련의 관행입니다. 이는 위협 모델링, 개발자 대상 보안 교육, 소프트웨어 공급망 보안 등 10가지 주요 주제에 대한 권장 사항을 포함합니다. 마이크로소프트 자체도 이 접근 방식을 활용하여 기업들이 검증된 프로세스를 통해 개발자, 테스터, 보안 팀 간의 협업을 강화할 수 있도록 지원합니다.
ISO/IEC 27001 표준
ISO/IEC 27001 표준은 주로 정보 보안 관리 시스템(ISMS)을 위한 표준으로 알려져 있지만, 안전한 코딩에도 중요한 함의를 지닙니다. 조직 차원의 ISMS 구축에 중점을 두지만, 안전한 코딩과 관련된 원칙을 포함하고 있습니다. 이러한 권고 사항은 조직이 안전한 코딩 관행을 구현할 때 따를 수 있는 상위 수준의 지침을 제공합니다.

인공지능 안전 규칙
AI 코딩 도구는 그 어느 때보다 편리해졌지만, 안전하고 정확한 코드를 보장하지 못할 경우 오히려 해가 될 수 있습니다. Secure Code Warrior AI 보안 규칙 — 최초의 가이드라인 — 은 GitHub Copilot, Cline, Cursor, Windsurf와 같은 AI 도구와 함께 사용할 수 있는 안전한 코딩 모범 사례에 대한 지침을 제공합니다. 이 규칙들은 AI 코딩 어시스턴트가 올바른 방향으로 나아가도록 하며, 안전하지 않은 코드 위험을 최소화하는 장벽을 구축합니다.
처음부터 안전한 코드를 만드는 방법을 알아보세요
안전한 코딩은 단순한 기술적 요구사항을 넘어 핵심적인 비즈니스 이점입니다. 팀이 처음부터 안전한 코드를 작성하면 비용이 많이 드는 취약점을 방지하고, 데이터 유출 위험을 줄이며, 고객에게 신뢰할 수 있는 소프트웨어를 제공할 수 있습니다. 그러나 체계적인 지침 없이는 안전한 코딩 관행을 숙달하는 것이 특히 어려울 수 있습니다. 개발자들은 구체적인 실천 방법, 진화하는 위협에 대한 최신 지식, 그리고 각 코드 라인에 안전 원칙을 자신 있게 적용할 수 있는 방법이 필요합니다.
ISO 27001 인증을 획득하고 SOC 2 표준을 준수하는 Secure Code Warrior 애자일 학습 플랫폼은 바로 이러한 역량을 팀에 제공합니다. 각 언어별 보안 모범 사례 교육, 현실적인 코딩 과제, 다양한 역할에 맞춰 설계된 콘텐츠를 통해 보안은 부차적인 문제가 아닌 개발 프로세스의 자연스러운 일부가 됩니다. 개발자들은 취약점을 신속하게 식별하고 수정하는 데 필요한 기술을 습득하며, 업계 표준에 부합하고 소프트웨어 개발 라이프사이클 전반에 걸쳐 코드 보안을 완전히 책임질 수 있게 됩니다. 따라서 Secure Code Warrior 사용하는 기업들이 소프트웨어 취약점을 53% Secure Code Warrior , 최대 1,400만 달러의 비용을 절감하며, 개발자의 92%가 추가 교육을 원한다는 사실은 놀라운 일이 아닙니다.
팀이 첫날부터 더 안전하고 효율적인 코드를 작성하는 방법을 확인하고 싶다면, 지금 Secure Code Warrior 데모를 예약하세요.

아래 링크를 클릭하고 이 자료의 PDF를 다운로드하세요.
Secure Code Warrior 귀사의 조직이 소프트웨어 개발 주기 전반에 걸쳐 코드를 안전하게 보호하고 사이버보안이 최우선 과제인 문화를 조성하도록 Secure Code Warrior . 애플리케이션 보안 담당자, 개발자, IT 보안 책임자 또는 보안 관련 업무에 종사하는 모든 분들을 위해, 저희는 귀사의 조직이 안전하지 않은 코드로 인한 위험을 줄일 수 있도록 돕습니다.
보고서 표시데모 예약하기Secure Code Warrior fait du codage sécurisé une expérience positive et engageante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son parcours d'apprentissage préféré, afin que les développeurs doués pour la sécurité deviennent les super-héros du quotidien de notre monde connecté.
Cet article a été rédigé par l'équipe d'experts du secteur de Secure Code Warrior, qui s'est engagée à donner aux développeurs les connaissances et les compétences nécessaires pour créer des logiciels sécurisés dès le départ. S'appuyant sur une expertise approfondie en matière de pratiques de codage sécurisé, de tendances du secteur et de connaissances du monde réel.
소프트웨어 취약점이 부차적인 문제나 혁신의 장애물로 간주될 때, 기업들은 데이터 유출, 평판 손상 및 막대한 법적 책임에 노출됩니다. 사이버 공격은 종종 더 엄격한 개발 관행을 통해 방지할 수 있었던 코드의 취약점을 악용합니다.
안전한 코딩은 개발의 각 단계에 보안 원칙을 통합함으로써 이러한 과제를 해결합니다. 취약점이 발견된 후 패치를 적용하는 대신, 개발자는 인젝션 공격 및 크로스 사이트 스크립팅(XSS)과 같은 일반적인 위협에 대한 내장형 보호 기능을 갖춘 코드를 작성합니다. 보안 코딩이 어떻게 기업이 위험을 줄이고 사용자 신뢰를 유지하며 규제 요건을 준수하는 동시에 신뢰할 수 있고 고품질의 소프트웨어를 제공할 수 있는지 자세히 살펴보겠습니다.
보안 코딩이란 무엇인가요?
안전한 코딩은 소프트웨어 작성 시 잠재적 취약점을 수정하기 위해 보안 모범 사례를 따르는 원칙입니다. 보안을 개발 과정의 별도 단계로 취급하기보다는, 보안 코딩은 검증된 보호 조치를 초기 단계부터 통합하여 개발자가 코드 보안을 책임지고 효과적으로 적용할 수 있는 역량을 갖추도록 보장합니다.
오픈 월드와이드 애플리케이션 보안 프로젝트(OWASP)나 소프트웨어 엔지니어링 연구소의 CERT 부서와 같은 기관에서 생산하는 공인된 안전한 코딩 표준은 공격자들이 악용하는 일반적인 함정을 피하려는 개발자들에게 나침반 역할을 할 수 있습니다. 현재 사이버 보안 환경에서는 기존 워크플로우에 이러한 전략을 안전하게 구현하기 위해 안전한 코딩에 대한 기본적이고 실용적인 기술을 지속적으로 활용하는 것이 필수적입니다. 예를 들어, 최대한 많은 사용자 입력을 검증하면 SQL 인젝션 공격을 방지할 수 있으며, 출력 코딩을 통해 XSS를 차단할 수 있습니다. 이러한 안전한 코딩 관행은 침해 위험을 줄이고 진화하는 사이버 위협에 견딜 수 있는 더 탄력적인 애플리케이션을 구축하는 데 기여합니다.
보안 코딩이 왜 그렇게 중요한가?
보안 코딩은 중요합니다. 많은 성공적인 사이버 공격이 개발 과정에서 방지할 수 있었던 취약점을 악용하기 때문입니다. 초기 단계부터 보안 관행을 우선시함으로써 공격자가 데이터를 침해하거나 운영을 방해하는 데 이용할 수 있는 취약점이 도입될 가능성을 줄일 수 있습니다. 소프트웨어 개발 생명주기(SDLC)의 각 단계에 보안을 통합하면 모든 기능, 업데이트 및 통합이 보호를 고려하여 설계되도록 보장합니다.
개발 단계에서 위험을 선제적으로 처리하는 것은 배포 후 수정하는 것보다 훨씬 비용 효율적입니다. 배포 후 수정은 긴급 패치, 서비스 중단 및 사고 대응 자원이 필요할 수 있습니다. 또한 데이터 보호 규정 준수를 향상시켜 잠재적인 벌금 및 법적 문제를 방지합니다. 안전한 코딩 관행은 기업에 대한 소비자 신뢰를 강화하고 강화된 보안을 브랜드 평판에 통합합니다.
코드에 공통적으로 존재하는 보안 취약점
안전한 코딩은 공격자가 악용하는 가장 빈번하고 위험한 취약점과 AI 기반 코딩 도구 사용과 같은 신종 위협 경로를 방지하는 것을 목표로 합니다. 다음은 몇 가지 일반적인 취약점, 이들이 초래할 수 있는 피해, 그리고 안전한 코딩이 이를 완화하는 데 어떻게 기여할 수 있는지에 대한 개요입니다.

역직렬화 오류
디세리얼라이제이션 결함은 애플리케이션이 외부 출처의 데이터를 적절한 검증 없이 수신하고 처리할 때 발생합니다. 세리얼라이제이션은 객체를 저장하거나 전송 가능한 형식으로 변환하는 반면, 디세리얼라이제이션은 해당 객체를 재구성하여 사용 가능하게 합니다. 디세리얼라이제이션 결함의 영향은 심각할 수 있으며, 임의 코드 실행이나 권한 상승을 초래할 수 있습니다. 안전한 코딩은 신뢰할 수 있고 검증된 데이터만 디세리얼라이즈되도록 보장하고, 신뢰할 수 없는 입력에 대한 네이티브 디세리얼라이제이션을 가능한 한 피함으로써 이 문제를 해결합니다.
주입 공격
주입 공격은 공격자가 애플리케이션이 명령이나 쿼리의 일부로 해석하는 입력을 제공할 때 발생합니다. 가장 잘 알려진 유형은 SQL 주입으로, 악의적인 SQL 문이 쿼리에 삽입되어 데이터베이스 콘텐츠에 접근하거나 수정하는 것입니다. 다른 유형으로는 공격자가 임의의 명령을 실행하는 명령어 주입과 LDAP(경량 디렉터리 접근 프로토콜) 주입이 있습니다. 주입 공격의 결과는 무단 데이터 접근 및 삭제부터 시스템 전체 침해에 이르기까지 다양합니다. 개인 정보, 금융 정보 또는 기밀 정보가 포함된 데이터베이스는 주요 표적이 됩니다. 안전한 코딩은 매개변수화된 쿼리나 준비된 문 사용, 처리 전 신뢰할 수 없는 데이터 이스케이프 처리, 엄격한 입력 검증을 통해 인젝션 취약점을 방지합니다. 이러한 안전한 코딩 관행은 공격자가 애플리케이션의 예상 동작을 변경하는 것을 막을 수 있습니다.

크로스 사이트 스크립팅(XSS)
크로스 사이트 스크립팅(XSS) 은 웹 애플리케이션을 대상으로 하는 인젝션 공격의 한 형태로, 다른 사용자가 보는 페이지에 악성 스크립트를 삽입합니다. 이는 일반적으로 애플리케이션이 검증되지 않은 사용자 입력을 출력에 포함시킬 때 발생합니다. 다른 사용자의 브라우저가 해당 페이지를 표시하면 악성 스크립트가 실행되어 쿠키를 탈취하거나 키 입력을 가로채거나 사용자를 악성 사이트로 리디렉션할 수 있습니다.
XSS의 영향에는 세션 탈취 및 신원 도용이 포함될 수 있습니다. 기업에게는 고객 신뢰를 훼손하며, 민감한 데이터가 유출될 경우 규제적 결과를 초래할 수 있습니다. 안전한 코딩은 사용자가 제공한 모든 입력을 표시하기 전에 정제하고 인코딩하며, 출력을 자동으로 이스케이프하는 프레임워크를 사용하고, 실행 가능한 스크립트를 제한하기 위해 콘텐츠 보안 정책(CSP)을 구현함으로써 XSS를 해결합니다.
출입 통제
제어 관련 취약점은 사용자가 볼 수 있거나 수행할 수 있는 항목에 대한 규칙이 올바르게 정의되거나 적용되지 않을 때 발생합니다. 결함이 있는 접근 제어는 공격자가 의도된 사용자 역할 제한을 우회하여 잠재적으로 민감한 데이터를 읽거나, 레코드를 수정하거나, 특권 사용자만 수행할 수 있는 작업을 수행할 수 있게 합니다.
접근 제어 문제는 중대한 도전 과제이며, 특히 AI 코딩 도구는 이 취약점 유형을 효과적으로 처리하는 데 어려움을 겪어 왔습니다. 이는 개발자의 기술과 인식 제고의 필요성을 강조합니다. 접근 제어 위반의 영향은 상당합니다. 예를 들어, 공격자가 관리자 전용 기능에 접근할 수 있다면 보안 설정을 비활성화하거나, 개인 정보를 추출하거나, 다른 사용자로 위장할 수 있습니다.
안전한 코딩 관행은 최소 권한 원칙에 따라 각 요청에 대해 서버 측 권한 제어 기능을 적용하고, 보안 조치로서 링크 숨김과 같은 단순한 은폐에만 의존하지 않음으로써 이러한 위험을 방지합니다. 또한 엄격한 접근 제어 테스트를 수행함으로써 이러한 보호 장치가 장기적으로 견고하게 유지되도록 보장할 수 있습니다.

크로스 사이트 요청 위조(CSRF)
크로스 사이트 요청 위조(CSRF) 공격은 사용자가 인증된 다른 사이트에서 원치 않는 작업을 수행하도록 강요합니다. 이는 자금 이체, 이메일 주소 변경 또는 계정 설정 수정 등을 포함할 수 있습니다. 이 공격이 가능한 이유는 브라우저가 위조된 요청에 쿠키와 같은 유효한 인증 토큰을 자동으로 포함시키기 때문입니다.
안전한 코딩은 각 사용자 세션마다 고유한 CSRF 방지 토큰을 구현하고 상태 변경 요청 시마다 이를 검증함으로써 CSRF로부터 보호합니다. 추가 방어 수단으로는 중요한 작업에 대한 재인증 요구 및 쿠키의 SameSite 속성 설정을 통해 쿠키가 사이트 간 요청과 함께 전송되는 것을 방지하는 것이 포함됩니다. 이러한 보호 기능을 개발 라이프사이클에 통합함으로써 시스템이 합법적이고 의도된 작업만 처리할 가능성을 높일 수 있습니다.
비보안 인증
비보안 인증은 사용자의 신원 확인 절차가 취약하거나 예측 가능하거나 결함이 있을 때 발생합니다. 이는 불량한 비밀번호 정책, 보안되지 않은 자격 증명 저장, 또는 다중 요소 인증(MFA) 부재로 인해 발생할 수 있습니다. 공격자는 이러한 취약점을 다양한 방법으로 악용할 수 있습니다. 여기에는 무차별 대입 공격, 자격 증명 스푸핑, 전송 중인 암호화되지 않은 자격 증명 정보 가로채기 등이 포함됩니다. 비보안 인증의 영향은 심각합니다. 공격자에게 사용자 계정, 관리 권한, 민감한 데이터에 대한 직접적인 접근 권한을 제공할 수 있기 때문입니다. 일단 내부로 침투한 공격자는 시스템을 더욱 손상시키거나 귀중한 정보를 탈취할 수 있습니다.
보안 코딩은 엄격한 비밀번호 요구사항을 적용하고, 저장된 인증 정보를 해시 처리 및 분류하며, 모든 인증 교환에 HTTPS와 같은 보안 프로토콜을 사용하고, 추가 검증 계층을 제공하기 위해 MFA를 통합함으로써 이 취약점을 해결합니다. 개발자는 또한 실패한 시도 횟수를 제한하고 의심스러운 활동을 신속하게 탐지하는 로그인 메커니즘을 설계해야 합니다. 이를 통해 인증 시스템이 취약점이 아닌 견고한 방어선 역할을 할 수 있도록 해야 합니다.
안전한 코딩을 위한 6가지 실천 방법
안전한 소프트웨어 개발은 기존 위협을 아는 데 그치지 않습니다. 검증된 안전한 코딩 관행과 패턴을 학습하고 적용해야 합니다. 아래 기술들은 개발자가 각 프로젝트에 보안을 통합하기 위해 취할 수 있는 구체적인 조치들을 제시합니다.
1. 사용자 접근 제어 구현
위에서 언급한 바와 같이, 사용자 접근 제어는 시스템 내 각 사용자 역할에 대한 권한을 정의하고 적용하는 것입니다. 강화된 접근 제어는 권한이 없는 사용자가 민감한 데이터를 조회하거나 레코드를 수정하거나 관리 작업을 수행하는 것을 방지합니다. 이는 사용자 계정이 침해될 경우 피해 범위를 제한하는 효과도 있습니다. 공격자는 해당 계정의 권한 범위 내에서만 활동할 수 있기 때문입니다.
효과적인 접근 제어는 신원을 확인하기 위한 강력한 인증과, 인증된 사용자가 요청된 작업을 수행할 권한이 있는지 확인하는 권한 부여 제어를 필요로 합니다. 최소 권한 원칙에 부합하도록 접근 제어 관행을 정기적으로 검토하여 사용자에게 업무 수행에 필요한 최소한의 접근 권한만 부여해야 합니다. 접근 제어는 또한 정책과 시스템 사용자를 최신 상태로 유지하기 위한 정기적인 모니터링과, 비정상적인 활동을 신속하게 감지하는 감사에 기반합니다.
2. 데이터 검증 및 정제
데이터 검증 및 정리는 처리 전 모든 입력 데이터를 확인하여 예상되는 형식, 유형 및 패턴을 충족하는지 확인한 후, 잠재적으로 위험한 내용을 제거하기 위해 데이터를 정리하는 과정을 의미합니다. 이러한 관행은 신뢰할 수 있는 출처에서도 데이터가 손상될 수 있으므로 모든 외부 출처의 입력 데이터에 적용되어야 합니다. 따라서 각 입력은 검증될 때까지 신뢰할 수 없는 것으로 간주해야 합니다. 검증 및 정화 과정을 개발 프로세스에 통합함으로써, 주입 공격과 같은 일반적인 위협에 대한 애플리케이션의 복원력을 보장할 수 있습니다.
3. 현대적인 언어로 작성하십시오
안전한 코딩은 단순히 코드를 작성하는 방식에만 국한되지 않습니다. 이는 보안 취약점 유입을 더 쉽게 방지할 수 있는 도구와 환경을 선택하는 문제이기도 합니다. 비록 완전히 현대적인 언어로 전환하는 것이 많은 기업에게 현실적이거나 효율적인 선택이 아닌 경우가 많지만, 최소한 부분적으로 현대적인 프로그래밍 언어를 사용하고 선택한 모든 언어의 최신 버전을 활용하는 것은 소프트웨어 보안을 향상시킬 수 있습니다. 현대적인 언어와 프레임워크는 일반적으로 향상된 메모리 안전성, 강화된 타입 검사, 그리고 일반적인 취약점에 대한 내장된 보호 기능을 제공합니다. 예를 들어, Rust나 Go와 같은 언어들은 보안에 중점을 두고 설계되어, 구식 언어들이 더 취약할 수 있는 버퍼 오버플로우 같은 문제를 방지합니다.
Java나 Python과 같은 기존 언어는 현대화 및 보안 강화가 어려울 수 있지만, 최신 버전을 유지하면 최신 보안 기능과 성능 개선 사항을 활용할 수 있습니다. 많은 업데이트는 알려진 취약점을 수정하고, 위험한 기능을 비활성화하며, 보다 안전한 기본 설정을 제공합니다.
4. 실무 코드 난독화
코드 난독화는 공격자가 소스 코드나 컴파일된 코드를 이해하거나 역설계하거나 조작하기 어렵게 만드는 과정입니다. 다른 보안 조치를 대체하지는 않지만, 애플리케이션의 민감한 로직과 루틴을 외부 시선으로부터 숨김으로써 추가적인 방어 계층을 제공합니다. 난독화에는 변수 및 함수 이름을 의미 없는 식별자로 변경하거나, 코드 구조를 재구성하여 추적하기 어렵게 만드는 등의 기법이 포함될 수 있습니다.
목표는 공격자가 취약점을 탐지하고 악용하는 데 필요한 비용과 노력을 증가시키는 것입니다. 안전한 코딩에서 난독화는 다른 엄격한 보안 관행과 결합되어 애플리케이션을 덜 매력적인 표적으로 만듭니다.

5. 코드를 스캔하고 모니터링하세요
안전한 코딩 관행에는 코드를 적극적으로 스캔하고 모니터링하는 것도 포함됩니다. 애플리케이션 정적 보안 테스트(SAST) 도구는 배포 전에 알려진 취약점을 탐지하기 위해 소스 코드를 분석하는 반면, 애플리케이션 동적 보안 테스트(DAST) 도구는 실행 중인 애플리케이션을 테스트하여 실시간으로 악용 가능한 결함을 탐지합니다. 두 접근 방식을 결합하면 문제를 조기에 지속적으로 탐지할 수 있습니다.
개발 단계에서의 디지털화 외에도, 운영 환경에서 지속적인 모니터링을 구현하는 것이 필수적입니다. 이는 비정상적인 활동 발생 시 경보를 설정하고, 보안 이벤트를 기록하며, 실행 중인 애플리케이션의 자체 방어 도구(RASP)를 활용하여 실시간으로 공격을 탐지하고 차단하는 것을 의미합니다. 정기적인 분석과 모니터링을 통해 개발 과정에서 취약점이 발견되더라도 심각한 피해가 발생하기 전에 신속하게 대응할 수 있는 가시성을 확보할 수 있습니다.
6. 안전한 코딩 표준을 문서화하고 구현하기
보안 코딩 표준 문서화는 팀이 안전하고 유지보수 가능하며 규정을 준수하는 코드를 작성하는 방식을 정의하는 명확한 지침 세트를 만드는 것입니다. 이러한 표준은 입력 검증, 오류 처리, 암호화 관행, 세션 관리와 같은 주제를 다루어야 하며, 기술 인프라에 특화된 일반적인 취약점을 해결하는 방법도 포함해야 합니다.
이러한 표준의 도입은 신입 엔지니어부터 시니어 아키텍트에 이르기까지 모든 개발자가 동일한 보안 원칙을 따르도록 보장합니다. 정기적인 교육 및 업데이트와 결합될 때, 이러한 표준은 개발 프로세스를 최신 보안 요구사항에 부합하도록 유지하는 살아있는 자원이 됩니다.
보안 코딩 표준 및 프레임워크
자체 코딩 표준을 수립하는 데 도움이 필요하시다면, 아래의 널리 사용되는 가이드라인이 도움이 될 수 있습니다. 이 가이드라인들은 일반적인 취약점을 해결하기 위한 다양한 관행을 다루며, 코딩 작업을 업계 모범 사례에 부합하도록 조정하는 방법을 명확히 하는 데 기여할 수 있습니다.
OWASP 보안 코딩 관행
OWASP는 개발자가 코드 작성 초기부터 최종 단계까지 보안을 통합하고자 할 때 가장 널리 인정받는 정보원 중 하나입니다. OWASP 개발자 가이드와 OWASP Top 10과 같은 핵심 보안 코딩 리소스를 제공합니다. OWASP의 접근 방식은 실행 가능성이 매우 높으며, 개발 과정에서 적용할 수 있는 체크리스트와 코딩 지침을 제공합니다.
OWASP 지침을 준수하면 프로젝트 간 안전한 코딩을 위한 공통 기준을 마련함으로써 팀에 이점을 제공합니다. OWASP는 새로운 위협 벡터와 공격 기법을 반영하기 위해 정기적으로 업데이트되므로, 조직은 이를 활용하여 새롭게 등장하는 위험에 대비할 수 있습니다. OWASP 원칙을 워크플로우에 통합하면 코드 품질을 향상시키고 취약점을 줄이며 업계에서 널리 인정받는 지침을 준수하게 됩니다.

NIST 보안 소프트웨어 개발 프레임워크
미국 국립표준기술연구소(NIST)는 포괄적인 사이버보안 프레임워크와 함께 안전한 코딩에 관한 상세한 지침을 발표합니다. NIST의 안전한 소프트웨어 개발 프레임워크(SSDF) 는 안전한 소프트웨어 개발 관행에 대한 고수준 정보를 제공하는 것 외에도, 기업 내 팀 및 팀 간 핵심 사안에 대한 의사소통을 개선하는 공통 용어를 제시합니다. 이 프레임워크는 특정 기술보다 결과에 중점을 두므로 OWASP나 SEI CERT 코딩 표준과 같은 다른 표준과 함께 보완적으로 활용하는 것이 바람직합니다.
SEI CERT 코딩 규범
소프트웨어 공학 연구소(SEI)의 CERT 부서에서 개발한 SEI CERT 코딩 표준은 C, C++, Java, Perl 등 특정 프로그래밍 언어에서 보안 취약점을 방지하는 데 중점을 둡니다. 각 언어별 표준에는 안전한 코딩 규칙, 상세한 설명, 준수 및 비준수 코드 예시가 포함됩니다. CERT 코딩 표준은 특정 프로그래밍 언어의 미묘한 차이점과 특수성을 고려하므로, 해당 환경에서 작업하는 개발자들에게 매우 유용하고 실용적입니다.
Microsoft 보안 개발 주기
Microsoft의 보안 개발 수명주기(SDL)는 보안을 소프트웨어 개발 프로세스의 필수 요소로 만들기 위한 일련의 관행입니다. 이는 위협 모델링, 개발자 대상 보안 교육, 소프트웨어 공급망 보안 등 10가지 주요 주제에 대한 권장 사항을 포함합니다. 마이크로소프트 자체도 이 접근 방식을 활용하여 기업들이 검증된 프로세스를 통해 개발자, 테스터, 보안 팀 간의 협업을 강화할 수 있도록 지원합니다.
ISO/IEC 27001 표준
ISO/IEC 27001 표준은 주로 정보 보안 관리 시스템(ISMS)을 위한 표준으로 알려져 있지만, 안전한 코딩에도 중요한 함의를 지닙니다. 조직 차원의 ISMS 구축에 중점을 두지만, 안전한 코딩과 관련된 원칙을 포함하고 있습니다. 이러한 권고 사항은 조직이 안전한 코딩 관행을 구현할 때 따를 수 있는 상위 수준의 지침을 제공합니다.

인공지능 안전 규칙
AI 코딩 도구는 그 어느 때보다 편리해졌지만, 안전하고 정확한 코드를 보장하지 못할 경우 오히려 해가 될 수 있습니다. Secure Code Warrior AI 보안 규칙 — 최초의 가이드라인 — 은 GitHub Copilot, Cline, Cursor, Windsurf와 같은 AI 도구와 함께 사용할 수 있는 안전한 코딩 모범 사례에 대한 지침을 제공합니다. 이 규칙들은 AI 코딩 어시스턴트가 올바른 방향으로 나아가도록 하며, 안전하지 않은 코드 위험을 최소화하는 장벽을 구축합니다.
처음부터 안전한 코드를 만드는 방법을 알아보세요
안전한 코딩은 단순한 기술적 요구사항을 넘어 핵심적인 비즈니스 이점입니다. 팀이 처음부터 안전한 코드를 작성하면 비용이 많이 드는 취약점을 방지하고, 데이터 유출 위험을 줄이며, 고객에게 신뢰할 수 있는 소프트웨어를 제공할 수 있습니다. 그러나 체계적인 지침 없이는 안전한 코딩 관행을 숙달하는 것이 특히 어려울 수 있습니다. 개발자들은 구체적인 실천 방법, 진화하는 위협에 대한 최신 지식, 그리고 각 코드 라인에 안전 원칙을 자신 있게 적용할 수 있는 방법이 필요합니다.
ISO 27001 인증을 획득하고 SOC 2 표준을 준수하는 Secure Code Warrior 애자일 학습 플랫폼은 바로 이러한 역량을 팀에 제공합니다. 각 언어별 보안 모범 사례 교육, 현실적인 코딩 과제, 다양한 역할에 맞춰 설계된 콘텐츠를 통해 보안은 부차적인 문제가 아닌 개발 프로세스의 자연스러운 일부가 됩니다. 개발자들은 취약점을 신속하게 식별하고 수정하는 데 필요한 기술을 습득하며, 업계 표준에 부합하고 소프트웨어 개발 라이프사이클 전반에 걸쳐 코드 보안을 완전히 책임질 수 있게 됩니다. 따라서 Secure Code Warrior 사용하는 기업들이 소프트웨어 취약점을 53% Secure Code Warrior , 최대 1,400만 달러의 비용을 절감하며, 개발자의 92%가 추가 교육을 원한다는 사실은 놀라운 일이 아닙니다.
팀이 첫날부터 더 안전하고 효율적인 코드를 작성하는 방법을 확인하고 싶다면, 지금 Secure Code Warrior 데모를 예약하세요.
목차
Secure Code Warrior fait du codage sécurisé une expérience positive et engageante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son parcours d'apprentissage préféré, afin que les développeurs doués pour la sécurité deviennent les super-héros du quotidien de notre monde connecté.

Secure Code Warrior 귀사의 조직이 소프트웨어 개발 주기 전반에 걸쳐 코드를 안전하게 보호하고 사이버보안이 최우선 과제인 문화를 조성하도록 Secure Code Warrior . 애플리케이션 보안 담당자, 개발자, IT 보안 책임자 또는 보안 관련 업무에 종사하는 모든 분들을 위해, 저희는 귀사의 조직이 안전하지 않은 코드로 인한 위험을 줄일 수 있도록 돕습니다.
데모 예약하기Télécharger



%20(1).avif)
.avif)
