파이썬에서 사용자를 위한 2단계 인증을 쉽게 진행할 수 있도록 도와주는 라이브러리가 있어서 소개해드리려고 합니다
Pyotp라는 라이브러리를 사용하면 단 코드 몇 줄로 쉽게 2단계 인증을 진행할 수 있습니다
실제로 2단계 인증은 많은 프로그램에서 사용되고 있습니다 스팀이나 배틀넷등 게임 런처에도 많이 사용되고 있으며 실제로 스팀 2단계 인증이 활성화되어있는 경우 계정을 로그인하고 발급되는 일회용 키를 지정된 시간 안에 프로그램에 입력하여 일치할 경우 로그인이 됩니다 이는 사람이 아닌 매크로를 사용하거나 부정사용자가 계정을 접속하거나 개인정보 유출방지를 위하여 만든 인증수단입니다
2단계 인증 라이브러리 설치
pyotp 문서 사이트에 접속해보면 자세한 내용이 나와있으며 설치 명령어도 pip install pyotp로 매우 간단합니다
터미널에 해당 명령어를 입력하여 설치를 진행해 주세요
설치 명령어를 입력하고 위와 같이 Successfully installed 문구가 나오면 성공적으로 설치가 됩니다
해당 라이브러리를 활용하여 사용가능한 명령어는 깃허브 홈페이지에 자세히 나와있습니다
비밀 키 생성하기
Google Authenticator 및 기타 OTP 앱과 호환되는 32자 base32 암호를 생성하는 코드입니다
키를 생성 후에 출력해보면 위와 같이 base32 암호가 생성되는 걸 확인할 수 있습니다
otp 서비스 제공자만 해당키를 보유해야 하며 다른 사람에게 이 키가 유출되면 안 됩니다 키가 유출될 경우 다른 사람이 해당키를 사용하여 동일한 일회용 암호를 생성할 수 있습니다
위의 비밀키는 random_base32() 함수를 사용한 random키가 아닌 직접 따로 32자리 키를 설정하여도 됩니다
일회용 OTP키 생성하기
동일한 키가 나오는 걸 보여드리기 위해 이번에는 비밀키를 직접 지정하였습니다
예제에 나와있는 코드대로 totp 변수를 생성 후 새로운 OTP를 생성해줍니다 이때 키는 아까 직접 설정한 변수인 key를 인자값으로 넣어주세요그리고 totp.now()를 통해 결과를 출력해 봅니다
그러면 이렇게 일회용 OTP가 생성됩니다프로그램을 다시 실행해봐도 동일한 일회용 OTP가 생성됩니다 동일한 OTP가 나오는 이유는 시간을 기반으로 인증이 되기 때문입니다 해당 OTP는 30초마다 변경되어 생성됩니다
일회용 OTP키 인증하기
키 인증확인을 위하여 totp.verify함수를 사용하고 인증키에 해당하는 값을 넣어주면 됩니다만약 키인증이 성공될 경우 TRUE를 리턴하고 키인증이 실패할 경우 FALSE값이 리턴됩니다
전체 소스코드입니다 키를 고정하여 먼저 생성되는 OTP 6자리 값이 572875인걸 확인하였습니다그리고 키 인증구간에 동일한 값을 두 번 넣고 한 번은 키 생성 30가 지나기 전에 바로 인증하고 마지막 한 번은 키 생성 후 30초가 지난 후 다시 인증을 시도해 보았습니다
첫 번째 줄은 고정된 키값이며 두 번째 줄은 생성된 일회용 OTP값입니다그리고 인증을 시도해보았는데 처음 키가 생성된 후 30초가 지나기 전 인증을 해보니 TRUE라는 값을 반환하고 30초가 지난 뒤에 동일한 OTP값을 사용하여 인증해보았더니 인증에 실패하는 걸 확인할 수 있습니다
사용자로부터 인증받기
이번에는 사용자에게 값을 입력받아 OTP코드를 통해 인증을 해보겠습니다
위와 같이 코드를 작성하여 이번에는 키값을 랜덤으로 생성하였고 첫 번째로 OTP를 생성하여 화면에 출력해 줍니다그리고 유저에게 2단계 인증코드를 입력할 것을 요구하며 입력받은 값과 OTP의 값이 일치할 경우 TRUE를 반환하고 실패할 경우 FALSE를 반환합니다
실행결과 화면에 생성된 OTP를 사용자가 입력할 경우 정상적으로 True값을 반환합니다