인증(Authentication)
- 회원가입과 로그인을 말합니다.
- 자신인것을 증명한다.
개발자의 인증은?
- 우리 서비스를 누가 쓰는지? 어떻게 사용하는지? 추적이 가능하도록?
인증에 필요한것은 무엇이 있나요?- 아이디 이메일 "비밀번호" 비번이 제일 중요합니다.
비밀번호 어떻게 관리해야하는가? 개인정보보호법에 따라 규정하고있다.
1. Database에 저장시 개인정보를 해싱하여 복원할수 없도록 함.
2. 통신 시 개인 정보를 주고받을 때 SSL을 적용하여 암호화(https) 자물쇠모양이 있는지 확인.
암호화는 어떻게 할까요?
단방향 해쉬란?
- 본래 해쉬(hash)함수는 자료 구조에서 빠른 자료의 검색 데어터의 위변조 체크를 위해서 쓰이지만 복원이 불가능한 단방향 해쉬함수는 암호학적 용도로 사용합니다.
- MD5,SHA-1 SHA-256
- "test password"를 hash256이라는 해쉬 함수를 사용하면0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e 값이 나온다.
하지만 같은 알고리즘으로 "test password" 다시 해싱하면 항상같은 값을 준다.- rainbow table --> 해시값으로 만들어서 판매하는 서비스도 존재합니다.
SALTING & KeyStretching?
bcrypt
- 개념들을 실제로 적용하기 편하게 해주는 대표적인 라이브러리입니다.
- Bcrypt.gensalt()
두개의 값을 비교할때
bcrypt checkpw(input_pw.encode(), user_pw.encode()) 두개의 값을 binary 비교한다
- salt값은 계속 바뀝니다. (위에서 뿌리듯 렌덤으로 뿌려진다.)
- bcrypt를 통해 해싱된 결과값(digest)의 구조는 아래와 같습니다.
인가(Authorization)
- 허락하는 의미
- 사용자가 서버에 로그인하면 해당 사용자가 맞는지 확인하는 과정이 바로 인가입니다.
http의 특징은 무엇일까요?- request/response 요청과 응답.
- stateless한 성질(저장하지 않는 성질)
JSON Web Token 일명 JWT라고 합니다.
- JWT: 암호화된 정보를 토큰으로저장
backend가 token을 생성해서 frontend한테 전송한다
브라우저에 저장한다.- token=jwt.encode({'name':user.name}, secret key , algorithm = 'HS256'
- type(token) = byte기 때문에 바꿔줘야한다.
- jwt.decode(token, 'secret key' algorithm = 'HS256')
헤더?
- 토큰의 타입과 해시 알고리즘 정보가 들어갑니다.
- 헤더의 내용은 BASE64 방식으로 인코딩해서 JWT의 가장 첫 부분에 기록됩니다.
페이로드(내용)?- exp와 같이 만료시간을 나타내는 공개 클레임.
- 클라이언트와 서버간 협의하에 사용하는 비공개 클레임
- 위의 두가지 요소를 조합하여 작성한뒤 BASE64 인코딩하여 두번째 요소로 위치합니다.
서명?
-JWT가 원본 그대로라는 것을 확인할때 사용하는 부분입니다.- 시그니쳐는 BASE64URL 인코드된 Header와 payload그리고 JWT secret(별도 생성)을 헤더에 지정된 암호 알고리즘으로 암호화하여 전송합니다.
- 주의 할점은 header와 payload는 Base64인코딩한것이므로
예시.
유도ip가 뭐가 될지 모르기때문에 서버를 구동할때
python manage.py runserver 0.0.0.0:8000 or 0:8000/(user/signup)--> request target
ip주소를 확인할때
ipconfig getifaddr en0