개발자를 위한 보안 가이드: OWASP Top 10 API 시리즈 - 인증 취약점(Broken Authentication)

인증 메커니즘은 올바르게 구현하기가 매우 어렵기 때문에, 손상된 인증이 OWASP API 보안 위협 목록에 포함된 것은 놀라운 일이 아닙니다. 또한, 인증 방식은 본질적으로 사용자에게 노출되어야 하므로 공격자가 이를 연구하고 악용할 수 있는 패턴이나 취약점을 찾을 기회를 제공한다는 점에서 공격자에게 다소 유리한 측면이 있습니다.
마지막으로, 인증은 애플리케이션과 잠재적으로는 네트워크 전체로 향하는 관문 역할을 하기 때문에 공격자들에게 매력적인 표적이 됩니다. 인증 프로세스가 손상되었거나 취약하다면 공격자가 해당 약점을 발견하고 악용할 가능성이 매우 높습니다.
이번 장에서는 인증 문제와 관련하여 악의적인 공격자를 차단하는 방법을 배워보겠습니다. 먼저 자신의 실력을 테스트해보고 싶다면, 저희가 준비한 게임화된 챌린지에 참여해 보세요:
점수를 높이고 싶으신가요? 저와 함께 하나씩 자세히 살펴보겠습니다.
손상되거나 잘못 구성된 인증의 예로는 어떤 것들이 있을까요?
문제가 명확하게 드러나지 않는 경우 중 하나는 인증 방식이 크리덴셜 스터핑(Credential Stuffing), 즉 알려진 사용자 이름과 비밀번호 목록을 사용하여 보안을 뚫는 공격에 취약한 경우입니다. 다중 인증(MFA)과 같이 일반적으로 매우 안전한 인증 방식이라 하더라도 요청에 대한 제한, 속도 조절 또는 기타 모니터링이 이루어지지 않으면 취약할 수 있습니다.
예를 들어, 공격자가 api/system/verification-codes에 POST 요청을 보내고 요청 본문에 사용자 이름을 제공하여 비밀번호 복구 요청을 트리거할 수 있습니다. 만약 앱이 6자리 코드를 사용자의 휴대폰으로 전송하는 SMS 인증 방식을 사용하는데 입력 필드에 제한이 없다면, 단 몇 분 만에 애플리케이션이 뚫릴 수 있습니다. 공격자는 올바른 코드를 맞출 때까지 가능한 모든 6자리 조합을 애플리케이션에 보내기만 하면 됩니다.
이 시나리오에서 겉으로 보기에는 2단계 인증을 사용하는 것이 애플리케이션을 안전하게 지켜줄 것처럼 보입니다. 하지만 사용자 입력에 대한 속도 제한이 없기 때문에 해당 인증은 손상되었으며 취약한 상태입니다.
또 다른 예로, 애플리케이션이 인코딩된 사용자 객체를 인증 쿠키로 사용하는 경우가 있습니다. 하지만 낮은 권한의 사용자 접근 권한을 가진 공격자가 Base64를 사용하여 해당 쿠키를 디코딩하면, 쿠키가 애플리케이션에서 세션과 사용자를 어떻게 정의하는지 알아낼 수 있습니다. 예를 들어, 디코딩 후 다음과 같은 JSON을 볼 수 있습니다:
{
"username" : "ShadyGuy",
"role" : "user"
{
이 시점에서 악의적인 사용자는 자신의 사용자 이름이나 역할, 또는 둘 다를 변경할 수 있습니다. 몇 가지 값을 변경함으로써 더 높은 권한을 가진 다른 사용자가 될 수 있는 것입니다:
{
"username" : "GoodGuy",
"role" : "admin"
{
이제 공격자가 이 정보를 다시 인코딩하여 쿠키 값으로 설정하면, 사실상 더 높은 권한을 가진 새로운 사용자가 됩니다. 이러한 변경을 방지하는 방법이 마련되어 있지 않다면, 애플리케이션이 해당 변조를 수용할 가능성이 매우 높습니다.
손상되거나 잘못 구성된 인증 제거하기
인증이 실패하면 전반적인 보안이 침해될 가능성이 큽니다. 하지만 애플리케이션을 코딩할 때 몇 가지 중요한 지침을 따르면 모든 것을 안전하게 유지하는 데 도움이 됩니다.
우선, 사용자가 프로그램 기능을 사용할 수 있도록 허용하는 모든 곳에 인증 확인 절차를 포함해야 합니다. 인증 확인 절차가 아예 없다면 시작부터 싸움에서 진 것이나 다름없습니다.
모범 사례 측면에서 명심해야 할 좋은 점은 사용자가 접근할 수 있는 URL에 세션 ID를 노출하지 않는 것입니다. 위에서 언급한 손상된 인증에 관한 두 번째 예시처럼, 세션 쿠키가 공격자에게 노출되지 않도록 하면 공격자가 이를 디코딩하려는 시도를 막기가 훨씬 쉬워집니다.
다중 인증을 구현하는 것도 좋은 방법입니다. 하드웨어 토큰을 사용하면 알고리즘을 통해 짧은 주기로 비밀번호를 생성하여 안전하게 인증할 수 있습니다. 사용자에게 이러한 장치를 제공하기 어렵다면 SMS 문자 메시지를 활용할 수도 있습니다. 단, 30초 동안 3~4회 정도로 요청 횟수를 제한하고, 인증 코드의 유효 시간을 몇 분 이내로 짧게 설정해야 합니다. 또한 영문과 숫자를 혼합한 코드를 사용하면 보안성을 더욱 높일 수 있습니다.
마지막으로, 가능하다면 사용자 이름이나 예측 가능한 순차적 값을 세션 ID로 사용하지 마십시오. 대신 매번 무작위 세션 ID를 생성하는 안전한 서버 측 세션 관리자를 사용하는 것이 좋습니다.
안전한 인증 방식을 구현하는 것은 일반적인 취약점을 해결하는 것보다 조금 더 까다롭습니다. 하지만 모든 애플리케이션, 프로그램, API에서 권한 부여는 매우 중요한 요소이므로, 시간을 충분히 투자하여 올바르게 구현할 가치가 있습니다.
이 취약점에 대한 더 자세한 정보와 조직 및 고객을 다양한 보안 위협으로부터 보호하는 방법은 Secure Code Warrior 블로그에서 확인하실 수 있습니다. 또한 데모를 체험하여 사이버 보안 기술을 지속적으로 연마하고 최신 상태로 유지해 보세요.
배포 전 AI 기반 개발 거버넌스 확보
AI 기반 위험을 측정하고, 커밋 시점에 보안 코딩 정책을 적용하며, SDLC 전반에 걸쳐 안전한 소프트웨어 제공 속도를 높이세요.
더 많은 블로그 살펴보기
보안 코딩, AI 거버넌스, 소프트웨어 리스크 관리에 관한 전문가 콘텐츠를 확인해 보세요.
%252520%252520(3).avif)
Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Security as culture: How Blue Prism cultivates world-class secure developers
Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed
배포 전 AI 기반 개발 보안 확보
소프트웨어 개발 수명 주기 전반에서 개발자 리스크를 파악하고, 정책을 시행하며, 취약점을 예방하세요.



.avif)