인증은 사용자가 누구인지 확인하는 절차이다. 회원가입,로그인 과정이 인증의 대표적인 예시다.
로그인 절차
access token
을 클라이언트에게 전송.access token
을 첨부해서 request를 서버에 전송함으로서 매번 로그인 해도 되지 않도록 한다.User 비밀번호 암호화
단방향 해쉬 함수(one-way-hash funtion)
가 일반적으로 쓰인다.다이제스트
를 생성한다. 원본 메세지를 알면 암호화된 메시지를 구하기는 쉽지만 암호환된 메시지로는 원본 메시지를 구할 수 없어서 단방향성(one-way)
이라고 한다.단방향 해쉬함수(one-way-hash function)
import hashlib
m = hashlib.sha256()
m.update(b"test password")
m.hexdigest()
# '0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e'
m.update(b"test password2")
m.hexdigest()
# '55819e5b1986d4cde0f033ab21e3fe97d63d48b56f80e5efd66a4d0e7aa5c617'
위의 코드를 보다시피 설정한 비밀번호는 비슷한데 해쉬 함수 값은 전혀 다른 값이 나온다. 이러한 효과를 avalance
라고 하는데 해쉬 값 해킹을 어렵게 만든다.
단방향 해쉬 함수도 취약점이 있다.
Rainbow table attack
: 미리 해쉬값을 계산해놓은 테이블이다.Salting
: 실제 비밀번호 이외에 추가적으로 랜ㄷ머 데이터를 더해서 해시값을 계산하는 방법Key Stretching
: 단방향 해쉬값을 계산 한 후 그 해쉬값을 또 해쉬하고, 또 반복한다.salting과 key stretching을 구현한 해쉬 함수중 가장 널리 사용되는 것이 bcrypt
이다. bcrypt
는 비밀번호를 단방향 암호화 하기 위해 만들어진 해쉬함수이다.
import bcrypt
bcrypt.hashpw(b"1234", bcrypt.gensalt())
# bcrypt.hashpw("1234".encode('utf-8'), bcrypt.gensalt())
# b'$2b$12$/whlnMxkLSmWutNv8/uFoueWDVKDLQSWKwWHlPGbo49oHge.1C0VC'
b"1234" 와 "1234".encode('utf-8')은 같은 의미이다. bytes
형태로 encode하겠다는 의미이다.
유저가 로그인에 성공했을 때 access token
이라고 하는 암호화된 유저 정보를 첨부해서 request를 보내게 된다.
access token
을 발행하는 방법은 여러가지가 있는데 그 중 JWT
방식이 가장 널리쓰인다. JWT
는 말그대로 유저 정보를 담음 JSON 데이터를 암호화 해서 클라이언트와 서버간에 주고 받는 것이다.access token
을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한도 확인할 수 있다.access token
을 생성한다. access token
에는 유저 정보를 확인할 수 있는 정보가 들어가 있어야 한다 (예를 들어 user id).access token
을 첨부해서 보낸다.access token
을 복호화 한다.