TIL79. 인증&인가

Jaeyeon·2021년 4월 5일
0
post-thumbnail

세션진행: 지훈님

인증이란?

  • 로그인 절차에서 정확한 이메일/비밀번호 조합을 입력했는지 확인하는 과정

인증은 왜 필요한가?

  • 우리 서비스를 누가 쓰는지? 어떻게 사용하는지? 추적이 가능하도록 하기 위해 필요하다.

인증에 필요한 것

  • 아이디,이메일주소,비밀번호
  • 이 중에서 가장 중요한 것은 비밀번호

비밀번호는 어떻게 관리?

  • 데이터베이스에 저장 시 개인정보를 해싱하여 복원할 수 없도록 함.

해쉬 (단방향 해쉬)

  • 본래 해쉬함수는 자료구조에서 빠른 자료의 검색,데이터의 위변조체크를 위해서 쓰지만, 복원이 불가능한 단방향 해쉬함수는 암호학적 용도로 사용한다.

단방향 해쉬의 보완점 salting과 key stretching

  • salting과 key stretching이라는 것을 추가.
  • 비밀번호와 임의로 생성한 문자열(salt)를 합쳐 해싱하여 이 해시값을 저장
  • key stretching은 단방향 해쉬값을 계산 한 후 그 해쉬값을 또 또 해쉬 하고, 또 이를 반복하는 것을 말한다.
  • 말그대로 소금치고 늘린다.

bcrypt

  • 앞서 말한 개념들(단방향 해쉬, salting, key stretching)을 실제로 적용하기 편하게 해주는 대표적인 라이브러리이다.
  • 해쉬 결과값에 소금값과 해시값 및 반복횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는데 있어 db설계를 복잡하게 할 필요없다.

bcrypt를 사용하려면
1. pip install bcrypt
2. import bcrypt

password ='1234'
bcrypt.hashpw(password, bcrypt.gensalt())

<예시>

hashed_password     = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')     # b까지 스트링으로 치기 때문에 encode후에 다시 decode하는 것!

인가란?

  • 사용자가 서버에 요청을 보내면 인증과정을 거쳐 확인된 사용자가 맞는지 확인하는 과정이 바로 인가 이다.
  • http의 stateless한 성질 때문에 매 http요청마다 headers를 활용하여 사용자가 인증 절차를 거친 사용자임을 증명하는 정보를 담아서 보내는 방법이다.

기존 인증/인가 방식

Json Web Token(JWT)

  • 헤더에는 어떤정보가 들어가는지?
  1. 토큰의 타입과 해시알고리즘 정보가 들어간다.
  2. 헤더의 내용은 BASE64방식으로 인코딩해서 JWT의 가장 첫부분에 기록된다.
  • 내용에는 어떤 정보가 들어가는지?
  1. 내용에는 exp와 같이 만료시간을 나타내는 공개 클레임
    (ex: 로그아웃 시간이 30분 남았습니다.)
  2. 클라이언트와 서버간 협의하에 사용하는 비공개 클레임
  3. 그 외 어떤 내용이던 상관없이 추가 가능
  • 서명에는 어떤 정보가 들어가는지?
  1. JWT가 원본 그대로라는 것을 확인할 때 사용하는 부분
  2. 프론트엔드가 JWT를 백엔드 API 서버로 전송하면 서버에서는 전송받은 JWT의 서명 부분을 복호화하여 서버에서 생성한 JWT가 맞는지 확인
  3. 마치 계약서의 위변조를 막기 위해 서로 사인하는 것과 같다고 보면 된다.
  4. 주의할 점은 header와 payload는 BASE64 인코딩한것(암호화 아님)이므로 개인정보를 담으면 안된다.

JWT를 활용한다면?

wrap-up

  • 단방향 해쉬 : 저장을 하면 개발자도 모른다.
  • 양방향 해쉬: 다시 풀어서 보면 숫자가 그대로 나온다.
    (ex: 주민등록번호)
  • salting & key stretching: 단방향 해쉬로만으로는 해킹이 쉬우므로 salting과 key stretching으로 해커가 해킹을 하는데 어려움을 겪게 하기위해 사용을 한다.
profile
생각하는 개발자 되기

0개의 댓글