인증은 회원가입과 로그인을 말한다.
간단하게 회원을 식별하기 위해서.
개인정보 보호법.
개인정보는 모두 암호화를 해줘야 한다.
암호화는 개인정보가 비인가자에게 노출되더라도 보호를 할 수 있는 방법.
복원이 불가능.
salting : 임의로 생성한 문자열
keyStretching :
salting & keystretching 개념들을 실제로 적용하기 편하게 해주는 대표적인 라이브러리.
토큰은 request Headers에 담겨서 보내진다.
encode는 str을 bytes타입으로 만든다. 즉, 이진수로 만든다. (반대로 bytes타입을 encode하면 str타입이 된다.)
encode, decode시에는 우리가 인식할 수 있는 형태로 변환하기 위해 'UTF-8' 유니코드 문자 규격을 사용. 디폴트로 UTF-8
값이 들어가지만, 명시적으로 넣어주는 것도 좋을 듯.
hashpw는 인자값으로 encoding된 bytes타입만 받기 때문에, 비밀번호를 encoding 해줘야 한다.
In [47]: bcrypt.hashpw("1234".encode(), bcrypt.gensalt())
Out[47]: b'$2b$12$tyaTR7U6kksDBQPMJUYykO1yC.w.KftcQtj91vGZptNgz/2GrmI/u'
이렇게 암호화된 방식은 일방향 암호화 즉 복호화 할 수 없도록 암호화하는 방식.
hash를 만들 당시의 salt나 algorithm을 따로 저장할 필요가 없다. bcrypt된 bytes안에 다 들어있기 때문. 해시값을 salt로써 쓸 수 있다.
애초에 회원가입에서 해시를 decoding 후에 DB에 저장해야 한다. 나중에 string끼리 비교해야 하기도 하고, encoding을 2번 할 수는 없기 때문.
유저의 정보를 간략하게 담아서 토큰으로 만들어 주고 받는다.
jwt token을 만들 때 필요한 것은 key와 algorithm이다.
key는 사이트(django에서는 프로젝트)마다 갖는 고유의 키를 말한다.
algorithm은 jwt를 어떤 알고리즘으로 인코딩할지를 말한다.
이 두 가지와 함께, 유저의 간단한 정보를 토큰화시킨다. 왜 간단한 정보일까? 토큰은 해석되기가 쉽고 브라우저에 저장되어 오가는 것이기 때문에, 보안상 예민한 정보는 담지 않으려고 하기 때문이다.
토큰을 decode할 때 필요한 것은 마찬가지로 key와 algorithm이다.
algorithm은 그래, encode할때 쓰였으니까 decode할때 해석할 기준이 필요하니까. 라고 생각할 수 있다.
근데 key는 왜 필요하지?라고 생각한다면 그건 사이트의 고유성 때문이다. 만약 네이버와 구글이 jwt를 encoding할때 쓰는 알고리즘이 같다고 치자. 그러면 네이버에 저장된 토큰을 구글에 그대로 쓴다면, 같은 유저로는 아니더라도 (오히려 그래서 위험하다) 로그인은 될 수 있다. 그러니 사이트마다 다른 key를 쓰는 것.