훈훈훈
파이썬(Django) : 인증(Authentication)과 인가(Authorization) 본문
# 인증(Authentication)과 인가(Authorization)
- 인증 : 사용자의 신원을 확인하는 절차이며, 사용자 ID 와 Password를 받아서 등록된 사용자가 맞는지 검증하는 과정이다
- 인가 : 인증이 로그인 과정이라면 인가는 로그인 후 사용자에게 권한을 부여하는 과정이다.
# API Token
- 인증 방법의 한 종류, API Token을 발급하여 사용자 인증
- 장점 : API Token 탈취 시 탈취자는 API를 호출할 수는 있지만 ID/Password 는 알 수 없어 2차 피해 예방 가능
네트워크로 ID/Password 전송 시 공격자로부터 탈취당할 수 있음
- 발급 절차 : 사용자 인증(ID/Password) -> API Token 발급 -> API Token으로 사용자 인증
# 해시 함수(Hash function)
- 임의의 길이의 데이터를 고정된 길이의 데이터로 맵핑하는 함수
- 단방향 암호화(One-way hash function)만 가능하며 개념적으로는 복호화를 할 수 없다. (해시함수 종류에 따라 이미 깨진 것도 있다 ....)
- 종류 : MD5(이미 깨짐), SHA256, Bcrypt 등
# 해시 함수를 사용하는 이유
- SQL Injection과 같은 공격으로 인해 침해사고 발생 시, DB에 저장된 사용자의 정보가 평문으로 그대로 노출될 수 있다.
- 따라서 정보가 노출되지 않기 위해 암호화를 무조건 해야한다.
- 양방향 암호화를 사용하지 않는 이유는 어떤 알고리즘을 사용했는지 알면 다시 복호화하여 ID/Password를 알 수 있기 때문
# 장고(Django) 에서 해시 함수 사용하는 방법 (Bcrypt 이용)
- 장고(Django)에서 아래 코드와 같이 패스워드 암호화 및 비교 등이 가능하다 .
- 파이썬에 기본적으로 bcrypt 모듈은 내장되어 있지 않기 때문에 pip install bcrypt 로 설치가 필요
import bcrypt # bcrypt 모듈 임포트
password = 'Hi1234' # 등록된 패스워드
hash_pw = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()) # password 인코딩 후 해시 값으로 변환
password2 = 'Hi1234' # 입력받은 패스워드
bcrypt.checkpw(password2.encode('utf-8'), hash_pw) # 입력받은 패스워드 비교 후 True or False 반환
# JWT(Json Web Tokens)
- 유저의 정보를 담은 Json 데이터를 암호화 해서 Client와 Server 간에 주고 받는 것을 토큰화
- 모듈 설치 명령어 : pip install pyjwt
- 구조 : Header, Payload, Signature 세 부분으로 구성
* Header : 토큰 타입 및 해시 사용되는 해시 알고리즘 저장
* Payload : JWT를 통해 실제 서버간에 전송되는 데이터 (HTTP body 부분과 유사)
* Signature : 발행된 JWT가 맞는지 검증하는 부분, 시그니처 부분이 실제로 암호화되는 부분이다.
Signature 부분 이외에 나머지 부분은 암호화가 아닌 인코딩 하여 전송한다. 따라서 누구나 원본 데이터를 읽을 수 있기 떄문에 민감한 데이터는 저장하지 않도록 주의하여야 한다,
- 장고(Django) 에서 JWT 사용하는 방법
import jwt
token = jwt.encode({'user_id' : 1}, 'Secret_Key', algorithm = 'HS256') # jwt 발행(SHA256 해시함수 사용)
** 참고할 만한 자료
https://medium.com/swlh/auth-with-json-web-tokens-bcrypt-part-i-rails-3afd71751ea
** 참고 자료
'파이썬 > Django' 카테고리의 다른 글
파이썬(Django) :: 회원 가입 및 로그인 API 구현 (0) | 2020.02.15 |
---|---|
파이썬(Django) :: SECRET_KEY 분리 방법 (0) | 2020.02.15 |
파이썬(Django) : 회원가입, 로그인 Simple API 구현 (1) | 2020.02.10 |
파이썬(Django) : QuerySet(쿼리셋) 이란 ? (1) | 2020.02.06 |
파이썬(Django) : 장고 웹 프레임 워크 정리 (0) | 2020.02.03 |