훈훈훈

파이썬(Django) : 인증(Authentication)과 인가(Authorization) 본문

파이썬/Django

파이썬(Django) : 인증(Authentication)과 인가(Authorization)

훈훈훈 2020. 2. 13. 18:02

# 인증(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

 

** 참고 자료

https://bcho.tistory.com/955

Comments