인증 & 인가(허가)
인증 (Authentication)
- 인증은 무엇일까
- 내가 나라는 것을 증명하는 것
- 웹 사이트 상에서 사용자가 자신이라는 것을 증명하는 것
- 회원을 식별하고 사용을 추적할 수 있다.
- 인증에 필요한 것
- 비밀번호의 관리
- 법규상의 강제
- 데이터베이스에 저장 시 개인 정보를 해싱하여 복원할 수 없도록 함
- 통신 시 개인 정보를 주고 받을 때 SSL을 적용하여 암호화(HTTPS)
- 암호화는 어떻게 하나?
단방향 해쉬
- 한쪽으로만 암호화를 진행해서 복호화 불가능(원본 암호 보기 불가능)
- 자료구조 중 하나
- 빠른 자료의 검색, 데이터 위변조 체크를 위해 쓰임
- 하나의 값이 들어가면 하나의 값이 나옴
- 값이 나오면 역으로 들어갈 수 없음
- 이 특징을 이용하여 암호화를 시킴
SALTING & KeyStretching
- 단순해쉬값이 해킹에 쉽게 노출되어 Salting이라는 아이디어 생겨남
- salt값은 hash를 좀 더 강인하게 만듬
- 입력한 비밀번호와 임의로 생성한 문자열(Salt) 합쳐서 해싱해 해시값을 저장
- 이 때 비교를 위해 해시값과 Salt값을 같이 저장해야 한다.
- 여기에 해커가 패스워드 무작위 대입을 통해 해시값을 계산하는데 필요한 시간을 끌기 위한 방법이 있음
- Salting 및 해싱을 여러번 반복해서 원본 값을 유추하기 어렵게 만듬
- Key Strectching
Bcrypt
- Salting & Key Streching 을 제공하는 대표적 라이브러리
- hash 결과값에 소금값과 해시값 및 반복 횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는데 있어 DB 설계를 복잡하게 할 필요 없음
- bcrypt을 통해 해싱된 결과 값(Digest)의 구조
- Algorithm, Algorithm options (Eg cost), Salt, Hashed password
사진 출처 - https://developer.team/delphi/28912-bcrypt-a-library-to-help-you-hash-passwords.html
인가 (Authorization)
- 사용자가 서버에 로그인 할 시 해당 사용자가 맞는지 확인하는 과정
- JSON Web Token => JWT
- 백엔드에서 사용자가 로그인 했을 때 Token을 생성하고 프론트엔드에서 로그인 정보를 필요로 하는 기능일 때 Token을 저장했다가 Token 을 건낸다.
JSON Web Token (JWT)
- 헤더에 들어가는 정보
- 토큰의 타입
- 해시알고리즘 정보
- 헤더의 내용은 BASE64 방식으로 인코딩 되어 JWT의 첫 부분에 기록됨
내용 (payload)
- 내용에는 exp와 같이 만료시간을 나타내는 공개 클레임
- 클라이언트와 서버간 협의하에 사용하는 비공개 클레임
- 위 두가지 요소를 조합하여 BASE64 인코딩하여 두번째 요소로 위치
- 실제 개인 정보 x
- ex) {"user_id" : 1, "exp" : 153945654}
서명 (signature)
- JWT가 원본 그대로라는 것을 확인할 때 사용
- Django의 시크릿 키
- 계약서의 위변조를 막기위해 서로 사인하는 것과 같음
- 누구나 원본을 볼 수 있으면 안된다.