TIL . 인증 & 인가와 bcrypt, jwt

rahula·2021년 7월 8일
0

인증

인증은 회원가입과 로그인을 말한다.

인증은 왜 필요한가?

간단하게 회원을 식별하기 위해서.

비밀번호 어떻게 관리해야 하는가?

개인정보 보호법.

개인정보는 모두 암호화를 해줘야 한다.
암호화는 개인정보가 비인가자에게 노출되더라도 보호를 할 수 있는 방법.

단방향 해쉬

복원이 불가능.

salting : 임의로 생성한 문자열
keyStretching :

bcrypt

salting & keystretching 개념들을 실제로 적용하기 편하게 해주는 대표적인 라이브러리.

토큰은 request Headers에 담겨서 보내진다.

단방향 해쉬 생성

encode

encode는 str을 bytes타입으로 만든다. 즉, 이진수로 만든다. (반대로 bytes타입을 encode하면 str타입이 된다.)

encode, decode시에는 우리가 인식할 수 있는 형태로 변환하기 위해 'UTF-8' 유니코드 문자 규격을 사용. 디폴트로 UTF-8값이 들어가지만, 명시적으로 넣어주는 것도 좋을 듯.

hashpw는 인자값으로 encoding된 bytes타입만 받기 때문에, 비밀번호를 encoding 해줘야 한다.

hashpw의 결과

In [47]: bcrypt.hashpw("1234".encode(), bcrypt.gensalt())
Out[47]: b'$2b$12$tyaTR7U6kksDBQPMJUYykO1yC.w.KftcQtj91vGZptNgz/2GrmI/u'

이렇게 암호화된 방식은 일방향 암호화 즉 복호화 할 수 없도록 암호화하는 방식.

salt를 저장할 필요가 없는 이유

hash를 만들 당시의 salt나 algorithm을 따로 저장할 필요가 없다. bcrypt된 bytes안에 다 들어있기 때문. 해시값을 salt로써 쓸 수 있다.

decode

애초에 회원가입에서 해시를 decoding 후에 DB에 저장해야 한다. 나중에 string끼리 비교해야 하기도 하고, encoding을 2번 할 수는 없기 때문.

인가

jwt

유저의 정보를 간략하게 담아서 토큰으로 만들어 주고 받는다.

encode

jwt token을 만들 때 필요한 것은 key와 algorithm이다.

key는 사이트(django에서는 프로젝트)마다 갖는 고유의 키를 말한다.

algorithm은 jwt를 어떤 알고리즘으로 인코딩할지를 말한다.

이 두 가지와 함께, 유저의 간단한 정보를 토큰화시킨다. 왜 간단한 정보일까? 토큰은 해석되기가 쉽고 브라우저에 저장되어 오가는 것이기 때문에, 보안상 예민한 정보는 담지 않으려고 하기 때문이다.

decode

토큰을 decode할 때 필요한 것은 마찬가지로 key와 algorithm이다.

algorithm은 그래, encode할때 쓰였으니까 decode할때 해석할 기준이 필요하니까. 라고 생각할 수 있다.
근데 key는 왜 필요하지?라고 생각한다면 그건 사이트의 고유성 때문이다. 만약 네이버와 구글이 jwt를 encoding할때 쓰는 알고리즘이 같다고 치자. 그러면 네이버에 저장된 토큰을 구글에 그대로 쓴다면, 같은 유저로는 아니더라도 (오히려 그래서 위험하다) 로그인은 될 수 있다. 그러니 사이트마다 다른 key를 쓰는 것.

생각과 질문

  1. bcrypt와 gensalt로 보안이 충분할까? 잘 모르겠다.
  2. jwt도 마찬가지.
profile
백엔드 지망 대학생

0개의 댓글