[TIL] # 36 JWT, Bcrypt

ddalkigum·2021년 1월 5일
3

TIL

목록 보기
35/50
post-thumbnail

api에서 인증, 인가 절차에 따라서 사용되는 bcrypt, jwt

회원가입을 하게되면 나의 정보를 서버의 DB에 저장하게되고,
이를 바탕으로 인증, 인가가 이루어 지게되는데 이런 상황에서
내 정보를 보호하기 위해 만들어 진 것이다

로그인 절차

  1. 유저의 개인정보를 받음

  2. 비밀번호를 암호화해서 DB에 저장
    여기서 Bcrypt를 이용해서 암호화하여 DB에 저장하게됨

  3. 로그인

  4. 암호화되어 저장된 패스워드와 입력한 패스워드를 비교

  5. 일치하면 token을 발금
    jwt를 이용하여 중요하지 않은 정보가 담긴 token이 발행됨

  6. 로그인이 필요한 데이터에 접근 할 경우, token을 이용해 유저를 확인한다
    매번 로그인 할 필요 없이 기능을 사용할 수 있게 됨

Bcrypt

단방향 해시 함수이며,
패스워드를 저장할 때 사용된다

비밀번호를 암호화된 메시지인 다이제스트( digest )를 생성한다

원본 메시지를 알고 있다면, 복호화를 하기 쉽지만, 암호화된 메시지로는 원본 메시지를 구할 수 없어
단방향성이라고 한다

Bcrypt는 비밀번호 해시함수로 Blowfish라는 암호에 기반하였다.
Bcrypt는 gensalt를 사용하여, 암호화를 진행한다
여기서 gensalt는 랜덤한 스트링을 생성하여 salting을 해주는 과정이고
이렇게 암호화된 패스워드는 항상 길이가 60인 바이트 코드를 가지게된다

취약점

Rainbow table Attack 이라고 하여,
예상되는 hash값들을 계산해놓은 테이블을 이용하여 암호화된 메시지를 알아내는 방법이다

이러한 점을 대비하게 위해 단방향성 hash 함수에는 2가지의 방법이 사용된다

  1. Salting
  2. key Stretching

Salting

내가 입력한 데이터에 추가로 스트링을 붙여서 암호화를 진행하는데
이 과정을 salting이라고 한다

Key Stretching

해쉬작업을 1번이 아닌 여러번을 진행하여 복호화하는데 시간이 걸리게 만드는 과정

Bcrypt에서의 보안

Bcrypt에서는 gensalt를 이용하여 암호화를 한다

def hashpw(password: bytes, salt: bytes) -> bytes:

bcrypt의 Definition을 보게되면 hashpw를 만드는 과정에서
byte type의 코드와 salt 값을 넣어주어서 암호화를 진행한다

위의 경우는 같은 비밀번호를 여러번 저장했을 경우인데,
바이트코드가 모두 다른걸 확인 할 수 있다

JWT

Json Web Token 의 줄임말로

access_token을 발급하는 여러 방법중 하나이다

로그인을 하면 토큰이 발급되고 이 토큰을 이용해서 유저를 확인하고
이후에 이용하는 서비스에 대해서 로그인을 할 필요없이 기능을 이용할 수 있게 해줌

token은 headers를 통해 프론트로 전달해준다

예전에는 바이트코드를 이루어진 token을 이용했지만,
지금은 string으로 되어진 token을 주고 받는다

구성

헤더

알고리즘의 종류와 토큰 타입이 담기는 곳

헤더의 내용은 BASE64방식으로 인코딩되어 JWT의 가장 첫부분에 기록이 됨

payload

정보가 담겨져 있는 부분으로

내용에는 exp와 같이 만료시간을 나타내는 공개 클레임
그리고 클라이언트와 서버간 협의하에 사용하는 비공개 클레임
위의 두가지 요소를 조합하여 작성한뒤 BASE64 인코딩하여 두번째 요소로 위치합니다

Signature

시그니쳐는 BASE64URL로 인코드된 header와 payload JWT secret을 헤어데 지정된
알고리즘으로 암호화하여 전송합니다

프론트엔드에서 보낸 토큰이 위조, 변조가 일어났는지 확인하는 부분

암호화가 아닌 인코딩된 내용이 담겨있으므로, 누구나 원본을 볼 수 있다
따라서 중요한 정보를 토큰으로 만들어 저장하지 않는다

JWT웹사이트에 들어가게 되면 인코딩된 내용이 무엇인지 확인 가능하다

profile
딸기검 -본캐🐒 , 김준형 - 현실 본캐 🐒

6개의 댓글

comment-user-thumbnail
2021년 1월 5일

내가 블로그에 정리 안하는 이유 : 하려고 보면 이미 준형님이 깔끔하게 정리해서 올려둠

1개의 답글
comment-user-thumbnail
2021년 1월 7일

우와..준형님 열심히 하시고 계시네요😁 역시 엘리트

1개의 답글