Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python secrets 모듈로 안전한 난수 생성하기 – 비밀번호·보안 토큰 관리 가이드

암호학적으로 안전한 난수가 필요하다면 Python의 secrets 모듈을 사용하는 것이 가장 좋습니다. 이 모듈은 보안 비밀번호 생성, 계정 인증, 보안 토큰 발급 등 민감한 정보를 다루는 작업에 특화되어 있습니다.

흔히 사용하는 random 모듈은 결과가 예측될 수 있어 보안 목적으로는 부적합합니다. 반면 secrets 모듈은 운영체제가 제공하는 암호학적으로 강력한 무작위 소스를 기반으로 동작한다는 점이 결정적인 차이입니다.

secrets 모듈의 클래스와 함수를 사용하려면 먼저 코드 상단에서 모듈을 임포트해야 합니다.

import secrets

난수 생성 클래스와 메서드

secrets 모듈은 운영체제가 제공하는 가장 안전한 무작위성 소스에 접근할 수 있도록 도와줍니다. 난수 생성과 관련된 주요 클래스와 메서드는 다음과 같습니다.

클래스 secrets.SystemRandom

운영체제가 제공하는 최고 품질의 무작위 소스를 이용해 난수를 생성하는 클래스입니다. OS 수준의 암호학적 엔트로피를 활용하므로 보안이 중요한 환경에서도 신뢰할 수 있습니다.

메서드 secrets.choice(sequence)

비어 있지 않은 시퀀스(리스트, 문자열 등)에서 요소 하나를 무작위로 선택해 반환합니다. 비밀번호를 구성할 문자를 뽑을 때 자주 사용됩니다.

메서드 secrets.randbelow(n)

0부터 n 미만(n-1까지) 범위에서 정수 하나를 무작위로 선택해 반환합니다.

메서드 secrets.randbits(k)

k개의 무작위 비트로 이루어진 정수를 반환합니다. 비트 단위의 무작위 값이 필요할 때 유용합니다.

보안 토큰 생성

secrets 모듈은 안전한 토큰 생성 기능도 함께 제공합니다. 이런 토큰은 비밀번호 재설정 링크, 복잡한 세션 URL, 임시 인증 코드 등을 만들 때 널리 활용됩니다.

토큰 생성과 관련된 주요 메서드는 다음과 같습니다.

메서드 secrets.token_bytes([nbytes=None])

nbytes 길이의 무작위 바이트 문자열을 반환합니다. nbytes 값을 지정하지 않으면 모듈이 정한 기본값이 사용됩니다. 원시 바이트 데이터가 필요한 경우에 적합합니다.

메서드 secrets.token_hex([nbytes=None])

16진수 형태의 무작위 텍스트 문자열을 반환합니다. 반환된 문자열은 nbytes개의 무작위 바이트를 포함하며, 각 바이트는 두 자리 16진수로 변환됩니다. nbytes를 생략하면 기본값이 적용됩니다.

메서드 secrets.token_urlsafe([nbytes=None])

URL에 안전하게 사용할 수 있는 무작위 텍스트 문자열을 반환합니다. 문자열은 Base64로 인코딩되며, 평균적으로 바이트당 약 1.3자가 생성됩니다.

예제 코드

import secrets
my_sequence = ['K','?','D',':','o','5','t','l','Y','0']
rand_pass = ''
for i in range(15):
   rand_char = secrets.choice(my_sequence)
   rand_pass += rand_char
print("Random Password is: " + rand_pass)
my_tok1 = secrets.token_hex(10) # 길이 10의 HEX 토큰 생성
my_tok2 = secrets.token_hex(5)  # 길이 5의 HEX 토큰 생성
print("First Token: " + my_tok1)
print("First Token: " + my_tok2)

실행 결과

Random Password is: YK0l:YD??lKKY?o
First Token: f3e68646dcf1082e1038
First Token: e4ae3c2384

모든 값이 무작위로 생성되므로 실행할 때마다 출력 결과는 위 예시와 다르게 나타납니다.

활용 팁

실무에서는 string 모듈의 string.ascii_letters, string.digits, string.punctuation을 시퀀스로 활용하면 영문 대소문자, 숫자, 특수문자가 모두 포함된 강력한 비밀번호를 손쉽게 만들 수 있습니다. 또한 토큰 길이는 용도에 따라 조정하되, 보안이 중요한 서비스일수록 32바이트 이상의 충분히 긴 값을 사용하는 것이 권장됩니다.