ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Argon/Bcrypt가 CPU를 100% 사용하는 이유와 해결책
    Go 2024. 9. 7. 18:11

    Argon/Bcrypt가 CPU를 100% 사용하는 이유와 해결책

    안녕하세요!

     

    오늘은 Argon/Bcrypt 해시 함수가 사용자의 비밀번호를 해시할 때 CPU 사용량이 100%에 달하는 이유와 이 문제를 해결하기 위한 방법에 대해 알아볼까요?

     

    이 문제는 특히 많은 사용자가 동시에 로그인하거나 회원가입을 시도할 때 서버에 큰 부담을 줄 수 있는데요.

     

    어떤 문제인지 구체적으로 살펴보도록 하죠.

     

    문제의 배경

    현재 여러분의 Golang 애플리케이션에서 Argon/Bcrypt 해시 함수를 사용하여 비밀번호를 해시하고 있다고 가정해봅시다.

     

    Argon/Bcrypt는 보안성이 뛰어난 해시 알고리즘으로, 비밀번호를 안전하게 저장하기 위해 설계되었습니다.

     

    그러나 사용자가 비밀번호를 해시하는 과정에서 CPU 사용량이 100%에 도달하는 경우가 발생할 수 있습니다.

     

    이는 특히 한 번에 여러 사용자가 로그인하거나 회원가입을 시도할 때 문제가 됩니다.

     

    예를 들어, 아래와 같이 Argon2 해시 함수를 사용하여 비밀번호를 해시할 수 있습니다:

    package main
    
    import (
        "fmt"
        "log"
    
        "github.com/alexedwards/argon2id"
    )
    
    func main() {
        password := "my_secure_password"
    
        // 비밀번호 해시 생성
        hash, err := argon2id.CreateHash(password, argon2id.DefaultParams)
        if err != nil {
            log.Fatalf("Error creating hash: %v", err)
        }
    
        fmt.Println("Generated Hash:", hash)
    }

     

    위 코드에서 비밀번호를 해시하는 과정에서 CPU 자원을 많이 소모하게 되는데, 이로 인해 서버의 성능에 부정적인 영향을 줄 수 있습니다.

     

    한 사용자가 언급한 바에 따르면, "단일 해시가 CPU를 너무 많이 사용한다면, 여러 해시를 어떻게 처리할 수 있을지 고민해야 한다.

     

    서버가 다운될 수도 있다"는 점에서 이 문제는 심각합니다.

     

    CPU 사용량의 원인

    - CPU 집약적인 작업: Argon2와 Bcrypt와 같은 해시 알고리즘은 안전성을 높이기 위해 의도적으로 CPU 자원을 많이 사용합니다.

     

    해시 함수가 느리게 작동함으로써, 비밀번호 크래킹 공격을 어렵게 만들고자 하는 목표가 있습니다.

     

    이는 안전성을 확보하는 데는 좋지만, 서버의 성능에는 부담을 줄 수 있습니다.

     

    - 동시 사용자 처리 문제: 만약 두 명의 사용자가 동시에 비밀번호를 해시하려고 하면, CPU 자원이 나눠져서 각 요청의 처리 속도가 느려질 수 있습니다.

     

    Golang 커뮤니티의 한 유저는 글에서 “두 사용자가 동시에 등록하면 CPU를 공유하게 되어 두 사람이 더 오랜 시간이 걸릴 수 있다”고 설명했습니다.

     

    이 경우, 서버의 응답 속도가 느려져 사용자 경험에 악영향을 끼칠 수 있습니다.

     

    해결책

    이 문제를 해결하기 위해 몇 가지 전략을 고려할 수 있습니다.

    1. 해시 알고리즘 조정

    해시 알고리즘의 반복 횟수를 줄여 CPU 사용량을 감소시킬 수 있습니다.

     

    아래와 같이 기본 설정의 반복 횟수 대신 낮은 값을 설정할 수 있습니다:

    params := &argon2id.Params{
        Memory:     64 * 1024, // 메모리 사용량
        Iterations: 1,          // 반복 횟수
        Parallelism: 1,         // 병렬 처리 쓰레드 수
        SaltLength: 16,         // 소금 길이
        KeyLength: 32,          // 키 길이
    }
    
    hash, err := argon2id.CreateHash(password, params)

     

    이 방법은 보안성을 약화시킬 수 있으므로, 비밀번호 유출 가능성을 고려해야 합니다.

    2. 서버 구조 조정

    서버의 CPU 성능을 개선하거나, 여러 개의 인스턴스를 배포하여 처리할 수 있는 요청 수를 늘리는 방법도 있습니다.

     

    비밀번호 해시 작업을 별도의 서버에서 처리하도록 하거나, 요청을 큐 시스템으로 관리하여 각 요청이 충분한 CPU 자원을 확보할 수 있게 하는 것이죠.

     

    3. 비동기 처리

    비밀번호 해시 작업을 비동기적으로 수행하도록 서버를 구성할 수 있습니다.

     

    이를 통해 다른 요청을 처리하는 동안 비밀번호 해시 작업을 진행할 수 있어, 서버의 효율성을 높일 수 있습니다.

    결론

    결론적으로, Argon/Bcrypt 해시 함수가 CPU 사용량을 100%로 만드는 문제는 해시 알고리즘의 특성과 동시 사용자 처리 문제에서 비롯됩니다.

     

    이를 해결하기 위해 해시 알고리즘의 설정을 조정하거나 서버 구조를 변경하는 방법이 있습니다.

     

    이러한 방법을 통해 서버의 성능을 개선하고 사용자 경험을 향상시킬 수 있을 것입니다.

     

     

     

Designed by Tistory.