간단하게 말하면 website 상에서 user를 식별하는것이다.
단방향 해쉬에 몇가지의 취약점이 있다. bcrypt는 그것을 방지하기위해
Salting
과
Key Stretching
을 제공해주는 대표적인 라이브러리다.
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
encode : string 타입을 bytes 타입으로 전환시켜준다. - 부호화
decode : bytes 타입을 string 타입으로 전환시켜준다. - 복호화
<Bcrypt 형식 이미지>
bcrypt.checkpw(request_password.encode('utf-8'),hashed_password)
해쉬된 비밀번호를 데이터 베이스에 보면 위 이미지와 같이 bcrypt된 암호가 저장된다. 요청한 비밀번호를 입력한뒤 위와 같은 코드를 입력하였을때 해시하기전 비밀번호와 같으면True
가 그렇지 않은 경우False
가 출력된다.
간단하게 로그인 한 사람이 추가적인 서비스 이용할때 권한 있는 유저인지 확인하는 절차이다.
권한이 있는 유저인지 확인하기위해 토큰을 부여한다.
토큰을 부여하기 위해서는 DB의 SECRET_KEY를 알아야하고 연결해줘야하며
access_token = jwt.encode({'id' : 1}, SECRET_KEY, algorithm = 'HS256')
로그인에 성공한 후에는 access token이라고 하는 암호화된 유저 정보를 첨부해서 request를 보내게 된다.
#EX)
POST /auth HTTP/1.1
Host: localhost:5000
Content-Type: application/json
{
"username": "joe",
"password": "pass"
}
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E"
}
위와 같이 토큰이 발행되며 서버에서는 access token을 복호화 해서 해당 유저 정보를 얻게 된다.
jwt.decode(access_token, SECRET, algorithm = 'HS256')
위와 같이 입력하면 {'id': 1}
의 값을 반환한다.
토큰을 활용하여 반대로 유저를 확인할 수도 있다.
JWT는 말 그대로 유저 정보를 담음 JSON 데이터를 암호화 해서 클라이언트와 서버간에 주고 받는 것이다.
1) 헤더 (header)
2) 내용 (payload)
3) 서명 (signature)