깔끔한 파이썬 탄탄한 백엔드 - 7장

Jajuna_99·2022년 6월 12일
0

7장 인증

  • 인증(Authentication)
  • 사용자 비밀번호 암호화
  • Bcrypt
  • Access token
  • JWT(JSON Web Tokens)
  • 인증(Authentication)

    인증은 사용자(user)의 신원(identification)을 확인하는 절차다. 대부분의 API에서 공통적으로 구현하는 기능이다.

    인증 절차로는 :
    1. 사용자 가입 절차를 진행해서 사용자의 아이디와 비밀번호를 생성
    2. 가입한 사용자의 아이디와 비밀번호(비밀번호는 암호화)를 DB에서 저장
    3. 사용자가 로그인할 때 본인의 아이디와 비밀번호 입력
    4. 사용자가 입력한 비밀번호를 암호화한 후, 그 값을 미리 DB에 저장해놨던 비밀번호랑 비교
    5. 일치하면 로그인 성공
    6. 로그인에 성공하면 백엔드 API 서버는 access token을 클라이언트 측에 보낸다.
    7. 클라이언트는 로그인 후, 요청할 때 access token을 첨부해 보내 매번 로그인 하지 않아도 됌.

    사용자 비밀번호 암호화

    사용자의 비밀번호를 암호화해서 저장하는 이유는 크게 2가지가 있다.

    • 해킹 공격에 대비
    • 내부 인력에 의해 DB가 노출되었을 경우에 대비

    사용자들은 보통 어떤 서비스던 비슷한 비밀번호를 사용하는 경향이 있어 비밀번호가 노출된다면 보안에 큰 문제가 생길 것이다.

    사용자의 비밀번호를 암호화할 때는 단방향 해시 함수(one-way hash function)가 일반적으로 쓰인다. (복호화 할 수 없는 함수)

    그렇다고 해킹의 위협으로부터 완벽히 안전할 수는 없다. (사실 정보보호병 하면서 제일 기억 남았던 말이 "제일 안전한 방어는 연결을 안하는 것" 이다...

    그래서 밑에 여러 암호화 기법들을 볼 것이다.

    Bcrypt

    위에서 설명했듯이 완벽한 보안은 없다. 그래서 책에서는 대표적인 비밀번호 해킹 방법 rainbow attack(해시 함수 값을 역추적해서 본래 값을 찾아내는 해킹)에 대안으로 Bcrypt 암호화 방법을소개한다.

    Bcrypt의 가장 큰 특징은 salting과 key stretching이다.

    • salting : 요리에서 음식에 간을 맞추기 위해서 소금을 더하듯이 실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시 값을 계산하는 방법을 salting이라고 한다.
    • key stretching : 기존 단방향 해시 알고리즘들의 실행 속도가 너무 빠르다는 취약점을 보안하기 위해서, 단방향 해시 값을 계산한 후 그 해시값을 또 해시하고... 이를 여러 번 반복하는 방법이 키 스트레칭(key stretching)이다.
    pip install bcrypt
    import bcrypt
    bcrypt.hashpw(b"secrete password", bcrypt.gensalt()).
    bcrypt.hashpw(b"secrete password", bcrypt.gensalt()).hex() #윗 줄은 16진수 값으로 생성

    터미널에서 위에 코드로 bcrypt 실습을 해볼 수 있다.

    Access Token

    클라이언트 측에서 백엔드 서버에 로그인을 했다고 증명할 수 있는 데이터이다.
    HTTP가 stateless라서 꼭 필요한 기능이다.

    JWT(JSON Web Tokens)

    access token을 생성하는 방법은 여러 가지가 있는데, 가장 널리 사용되는 기술 중 하나가 JWT(JSON Web Tokens)다.
    *이름 그대로 JSON 데이터를 token으로 변환하는 방식이다. (영어 어려운 거 없다!)

    JWT의 구조 :

    • header : 두 부분으로 구성돼 있으며, 토큰 타입 그리고 사용되는 해시 알고리즘을 지정. Base64URL 코드화 돼 있다.
    • payload : JWT를 통해 실제로 서버 간에 정송하고자 하는 데이터 부분, 역시 Base64URL 코드화 돼 있다.
    • signature : JWT가 원본 그래도라는 것을 확인할 때 사용되는 부분.
      *Base64URL는 암호화가 아니다.

    7장 요약

    private뿐 아니라 public API에서도 공통적으로 구현하는 중요한 인증(authentication)기능을 구현했다.

    인증 엔드포인트와 그 적용 실습 코드는 제 깃헙 타임라인을 참고하거나 다른 분들의 코드를 확인하면 되겠습니다.

    profile
    Learning bunch, mostly computer and language

    0개의 댓글