1.유저 ID와 PW 생성
2.유저 PW를 암호화해서 DB에 저장
3.유저 로그인 -> ID와PW 입력
4.유저가 입력한 PW를 암호화한 후 암호화 되서 DB에 저장된 유저 PW와 비교
5.일치하면 로그인 성공
6.로그인 성공하면 access token
을 클라이언트에게 전송
7.유저는 로그인 성공 후 다음부터는 access token
을 첨부하여 request를 서버에 전송함으로 매번 로그인 안해도 된다.
다이제스트(digest)
를 생성0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e
값이 나온다.d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb
값이 나온다. 실제 비밀번호는 비슷하지만 해쉬 함수 값은 완전히 틀린것을 볼 수 있다. 이러한 효과를 avalance라고 하는데 비밀번호 해쉬 값을 해킹을 어렵게 만드는 하나의 요소이다. In [21]: import hashlib
In [22]: m = hashlib.sha256()
In [23]: m.update(b"test password")
In [24]: m.hexdigest()
Out[24]: '0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e'
In [25]: m = hashlib.sha256()
In [26]: m.update(b"test password2")
In [27]: m.hexdigest()
Out[27]: 'd34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb'
단방향 해쉬 함수도 몇가지 취약점이 있다
1. Rainbow table attack - 미리 해쉬값을 계산해 놓은 테이블을 Rainbow table이라 함
2. 단방향 해쉬함수의 취약점을 보안하기 위해 Salting,Key Stretching이 사용됨
-Salting: 실제 PW 이외에 추가적으로 랜덤 데이터를 더하여 해쉬값을 계산
-Key Stretching: 단방향 해쉬값을 계산 후 그 해쉬값을 또 해쉬하고 반복하는 것
3. Salting과 Key Stretching을 구현한 해쉬 함수중 가장 널리 사용되는 것이 bcrypt이다. bcrypt는 처음부터 비밀번호를 단방향 암호화 하기 위해 만들이전 해쉬함수 이다.
유저가 로그인 성공한 후 access token
이라고 하는 암호화된 유저정보를 첨부해서 request를 보냄
JWT는 말 그대로 유저 정보를 담음 JSON 데이터를 암호화 해서 클라이언트와 서버간에 주고 받는 것이다.