ㅁ 개요
O 프로그램 소개
- 이번 글은 이전글(파이썬 구글OTP 클라이언트/서버에 적용하기 - 1.소개편)에 이은 2번째 글로 secret Key를 포함한 QR코드 생성 및 서버에 구글OTP알고리즘을 적용하는 방법에 대하여 설명합니다.
O 완성된 프로그램 실행 화면
1. 서버에서 생성된 QR코드 이미지를 이용자가 전달 받아 이미지를 열어보면 아래와 같이 생겼습니다.
이 QR코드 이미지를 QR코드스캐너 등으로 찍어보면 'secret Key'를 확인할 수 있습니다.
secret Key : ABCDEFGHIJKLMNOPQRSTUVWXYZ======
2. 이용자는 위에서 얻은 secret Key를 구글 OTP앱에 등록하여 OTP값을 정상적으로 얻었습니다.
3. 아래 서버에서 프로그램 실행 결과 OTP값이 위의 2번에서 이용자가 구글OTP로 실행한 값과 동일함을 알 수 있습니다.
이는 알고리즘이 동일하고(구글OTP알고리즘 즉, 'import onetimepass as otp' 모듈 적용) 이용자측와 서버측이 동일한 secret Key를 사용하기 때문입니다.
(즉, 바꿔서 이야기하면 secret Key가 이용자측과 서버측이 하나라도 다르면 OTP값을 서로 달라집니다.)
(※ 다음 글에서 이용자가 구글OTP에서 얻은 OTP값을 이용하여 실제 서버 로그인 화면에 입력 후 로그인하는 과정에 대하여 알아보겠습니다.)
O 시작전 준비 사항
1. 프로그램을 실행하기 위해서는 아래 모듈들이 필요합니다. 아래와 같이 임포트(설치) 해줍니다.
import onetimepass as otp # pip install onetimepass (파이썬용 구글 otp 모듈 적용)
import qrcode # pip install qrcode
※ 설치 시 에러가 발생거나, 궁금하신 점이 있으시면 댓글로 문의 주시면 친절하게 답변드리겠습니다.
ㅁ 세부 내용
O 완성된 소스
소스 : 2.py
import onetimepass as otp # pip install onetimepass
import qrcode
################################################################
# 1. QR코드 생성후 이용자에게 secretKey 전송
################################################################
img = qrcode.make("ABCDEFGHIJKLMNOPQRSTUVWXYZ======")
img.save("secretKey.img")
print(type(img))
print(img.size)
################################################################
################################################################
# 2. 이용자는 구글OTP앱을 설치 후 1.에서 전송받은 QR코드 이미지로부터
# 얻은 secretKey를 구글OTP에 등록
################################################################
################################################################
# 3. 서버 구축 후 인증부분에 구글OTP알고리즘 적용(임시 비밀번호 생성)
################################################################
secretKey = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ======'
def get_code():
print(secretKey,"+++++++++++++++++++++++ 999")
rt = otp.get_totp(secretKey)
print(rt, type(rt))
return rt
code = get_code()
print("서버쪽 임시 비밀번호(OTP생성값)1: ", code)
result = otp.valid_totp(code, secretKey) # 결과에 대한 유효성 검증
# = True
print(result)
O 소스 실행 방법
O 주요 내용
######### 서버 측 작업 ###########
1.QR코드 이미지를 생성하는 코드입니다.
관련된 모듈을 임포트 해주고, qrcode.make()함수 안에 secret Key를 넣어 줍니다.
(**주의 : secret Key는 32자리 문자열(정확히는 "Base32 인코딩된 10바이트 랜덤 문자열") 이므로, 정확히 32자(빈칸은 "="로 채움)가 들어가 합니다.
이 secret Key가 하나라도 바뀌면 변경된 내용을 서버와 이용자측 모두 동일하게 맞추어 주어야 정상 동작합니다.)
그리고 img.save()함수로 이미지를 생성합니다.
2.파일을 실행하면 아래와 같은 결과가 나타납니다.(타입은 qrcode 클래스 타입)
3.우리가 1에서 코딩한 이미지(secretKey.img)가 생성되었습니다.
위의 QR코드 이미지를 클라이언트(이용자)에게 전달하였다고 가정하고 아래를 진행합니다.
######### 클라이언트(이용자) 측 작업 ###########
4. 이용자가 이미지를 열어보면 아래와 같이 생겼습니다.
이 QR코드 이미지를 QR코드스캐너 등으로 찍어보면 'secret Key'를 확인할 수 있습니다.
4-1. 참고로 아래는 제가 사용한 QR코드 스캐너입니다.(아래와 전혀 이해관계자가 아닙니다.)
4-2. 위의 QR코드 스캐너 등으로 찍어 보면 아래와 같이 'secret Key'를 얻을 수 있습니다.
5. 구글 OTP앱을 설치합니다.
6. 설치 후 아래 순서대로 실행합니다.
7. 아래와 같이 구글OTP앱에 잘 등록 되었습니다.
######### 서버 측 작업 ###########
8.서버에서는 서비스 서버의 OTP관련 인증 로직 부분에 아래와 같이 코딩합니다.
(1) KMS 등 보안이 강화된 저장소에 secret Key를 보관하고, 이를 불러와서 otp.get_totp()함수를 통해 서버측 임시 비밀번호를 생성합니다.
(2) otp.valid_totp()함수로 (1)에서 생성된 임시 비밀번호가 유효한지 검증합니다.
9. 위의 코드를 실행하면 아래와 같이 나옵니다.
임시 비밀번호가 잘 생성되었고, 'True'로 나왔다면 검증결과 임시 비밀번호가 유효하다는 뜻입니다.
10. 다음 글에서 실제 이용자가 로그인 페이지에 접속하여 2팩터 인증을 하는 내용에 대하여 설명 드리겠습니다.
ㅁ 정리
O 우리가 배운 내용
1.이용자는 1에서 전달받은 QR코드 이미지로 부터 QR코드 스캐너 등을 통해 secret Key 획득 후
2.구글 OTP앱에 등록하여 임시 비밀번호를 얻음
오늘은 여기까지이며, 위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.
감사합니다.
※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.
'파이썬 실습 > 구글OTP 로그인 인증을 클라이언트&서버에 적용해 보기' 카테고리의 다른 글
파이썬 구글OTP 클라이언트/서버에 적용하기 - 3.로그인 페이지 접속 후 2팩터 인증하기 (0) | 2023.01.19 |
---|---|
파이썬 구글OTP 클라이언트/서버에 적용하기 - 1.소개편 (0) | 2023.01.19 |