지금까지 SQLAlchemy 로 miniter API 와 DB를 연결하였다. 여기서 인증 엔드포인트를 구현하지 않고 그대로 배포 한다면 마음대로 수정하고 안에 있는 정보를 빼앗길 가능성이 매우, 몹시 커질 것이다. 심지어 public API에도 남용 방지, 사용자 통계등의 이유로 인증 API가 꼭 필요하다고 하니 반드시 알고 만들어봐야 할 것이다. 더 나아가서 한 단계 더 높은 보안을 위해 비밀번호 암호화도 알아보기로 한다.
그런데 인증 이라고 하면 보통 Certification 인데 어째서 Authentication 일까? 하고 찾아보니 Certification 은 일정한 기준을 넘었을때 쓰는 단어고 Authentication 은 권한이 있는지에 대한 확인 여부 라고 한다. 우리가 쓰는 공용인증서가 Certificate 이니 지금 내가 다루고 있는 Authentication의 차이점을 아는것도 좋다고 생각한다.
인증 절차
mimiter API의 경우 sign-up 엔드포인트를 통해 가입을한다. → 아이디와 비밀번호를 DB에 저장한다. 이때 비밀번호는 암호화 해서 저장한다. → 사용자가 로그인시 아이디와 비밀번호를 입력 → 입력한 비밀번호를 암호화한 후 이미 암호화된 상태로 DB에 저장된 비밀번호와 비교 → 로그인 성공시 access token을 프론트엔드 혹은 클라이언트에 전송한다.
인증 절차를 대략적으로 알았고 HTTP 요청을 통해 회원가입을 하여 DB에 저장하는것 까지는 이전에 구현한 바 있다. 다음은 DB에 저장할 비밀번호를 암호화 시키는 것인데 왜 DB에 저장할 비밀번호도 암호화 해야 하는지? 그 이유는 무엇인지? 에 대해 알아볼 것이다.
암호화 하여 DB에 저장하는 두 가지 이유
1. 외부의 해킹 공격에 의해 DB가 노출되었을 경우를 대비하기 위해서
2. 내부 인력에 의해서 DB가 노출되었을 경우를 대비해서
이 두 가지 이유는 지금 당장 와닿지 않는 이유들이긴 하지만 취업하면 당연하게도 이러한 이유들로 DB가 노출되었다면 기업 입장에서는 굉장히 골치 아픈일 이므로 해킹이라는 불상사를 방지하기 위해서 지금이라도 배워둬야할 이유가 있다고 생각한다.
단방향 해시 함수(one-way hash function)
단방향 해시 함수는 비밀번호를 암호화 할 때 일반적으로 쓰이는 것으로 단방향(one-way)이라는 말 그대로 원본 비밀번호를 알면 암호화된 비밀번호를 구할 수 있지만, 암호화된 비밀번호로 원본 비밀번호를 알 수 없다. 따라서 DB 노출로 비밀번호를 알아내려고 해도 해커 눈에는 d65421ad864651df84561321sfd884651df 같이 굉장히 난해한 문자와 숫자의 조합만 보이게 될 것이다.
Python 에서 단방향 해시 함수를 구하는 hashlib 라는 모듈로 값들을 암호화 할 수 있다. 사용 예제는 다음과 같다.
import hashlib # hashlib 모듈을 import 하여 단방향 해시 암호화를 실행
password = hashlib.sha256() # sha256 라는 암호 알고리즘을 선택
password.update(b"password1234!") # 암호화 하려는 값을 인자로 설정하고 update 메소드 호출 b prefix를 비밀번호 앞에 붙여 바이트로 변환
password.hexdigest() # 암호화된 값을 hex(16진수) 값으로 읽어 들인다.
bcrypt 암호 알고리즘
단방향 해시 암호 알고리즘의 취약점을 이용한 rainbow attack 이라는 해킹 방법을 보완하고자 나타난 것으로 salting 방법과 키 스트레칭(key stretching)이라는 방법이 있다.
salting
salting은 실제 비밀번호 이외에 추가적인 랜덤 데이터를 더해서 해시 값을 계산하는 방법이다 음식에다 소금치는것과 같이 기존의 비밀번호에 추가로 값을 새로 입력하는 것으로 이해하면 되겠다.
키 스트레칭(key stretching)
키 스트레칭은 단방향 해시 값을 계산한 후 그 해시 값을 또 해시하고 다시 계산하는 것을 여러번 반복하는 것이다.
이러한 salting과 키 스트레칭을 통합한 암호 알고리즘이 바로 bcrypt 다.
bcrypt 설치와 사용
bcrypt는 외부 라이브러리로 설치가 필요하다 리눅스에서 설치하는 윈도우의 cmd 창에서 설치하는 pip install bcrypt 로 설치한다. 사용 코드는 다음과 같다.
'Backend > Flask 개발일지' 카테고리의 다른 글
19. miniter API Unit test 1 (0) | 2022.02.03 |
---|---|
18. 단위 테스트 (Unit test) 와 여러 테스트들 (0) | 2022.02.02 |
13. SQLAlchemy를 이용하여 API와 DB 연결하기 (0) | 2022.01.19 |
12. vscode 에 MySQL 연동하기 (0) | 2022.01.17 |
11. SQLAlchemy 라이브러리 설치와 config.py(연결정보 저장 파일) (0) | 2022.01.17 |