인증(Authentication)과 인가(Authorization)

박주엽·2020년 8월 11일
0

API 인증,인가

목록 보기
1/1

인증(Authentication)과 인가(Authorization)

  • 인증과 인가는 API에서 가장 자주 구현되는 기능중 하나
  • Private,Public한 API도 기본적인 인증과 인가를 요구

인증(Authentication)

  • 인증은 유저의 ID와 PW를 확인하는 절차
  • 인증을 하기 위해서 유저의 ID와 PW를 생성하는 기능도 필요

로그인 절차

1.유저 ID와 PW 생성
2.유저 PW를 암호화해서 DB에 저장
3.유저 로그인 -> ID와PW 입력
4.유저가 입력한 PW를 암호화한 후 암호화 되서 DB에 저장된 유저 PW와 비교
5.일치하면 로그인 성공
6.로그인 성공하면 access token을 클라이언트에게 전송
7.유저는 로그인 성공 후 다음부터는 access token을 첨부하여 request를 서버에 전송함으로 매번 로그인 안해도 된다.

유저 비밀번호 암호화

  • 유저의 PW는 암호화 해서 저장한다
  • PW 암호에는 단방향 해쉬 함수(one-way hash function)가 일반적으로 쓰임
    -단방향 해쉬함수는 원본 메세지를 변환하여 암호화된 메세지 다이제스트(digest)를 생성
    -원본 메세지를 알면 암호화된 메세지를 구하기 쉽다. 하지만 암호화된 메세지로는 원본메세지를 구할 수 없어서 단방향성 이라고 한다.
    -예를 들어, "test password"를 hash256이라는 해쉬 함수를 사용하면 0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e 값이 나온다.
    만일 "test password2"를 hash256 해쉬 함수를 사용하면 d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb 값이 나온다. 실제 비밀번호는 비슷하지만 해쉬 함수 값은 완전히 틀린것을 볼 수 있다. 이러한 효과를 avalance라고 하는데 비밀번호 해쉬 값을 해킹을 어렵게 만드는 하나의 요소이다.
    In [21]: import hashlib
    
    In [22]: m = hashlib.sha256()

    In [23]: m.update(b"test password")

    In [24]: m.hexdigest()
    Out[24]: '0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e'

    In [25]: m = hashlib.sha256()

    In [26]: m.update(b"test password2")

    In [27]: m.hexdigest()
    Out[27]: 'd34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb'

Bcrypt

단방향 해쉬 함수도 몇가지 취약점이 있다
1. Rainbow table attack - 미리 해쉬값을 계산해 놓은 테이블을 Rainbow table이라 함
2. 단방향 해쉬함수의 취약점을 보안하기 위해 Salting,Key Stretching이 사용됨
-Salting: 실제 PW 이외에 추가적으로 랜덤 데이터를 더하여 해쉬값을 계산
-Key Stretching: 단방향 해쉬값을 계산 후 그 해쉬값을 또 해쉬하고 반복하는 것
3. Salting과 Key Stretching을 구현한 해쉬 함수중 가장 널리 사용되는 것이 bcrypt이다. bcrypt는 처음부터 비밀번호를 단방향 암호화 하기 위해 만들이전 해쉬함수 이다.

JWT(JSON Web Tokens)

유저가 로그인 성공한 후 access token이라고 하는 암호화된 유저정보를 첨부해서 request를 보냄
JWT는 말 그대로 유저 정보를 담음 JSON 데이터를 암호화 해서 클라이언트와 서버간에 주고 받는 것이다.

0개의 댓글