인증과 인가

Woo Hwukjun·2020년 12월 7일
0

인증(Authentication)

  • 회원가입과 로그인을 말합니다.
  • 자신인것을 증명한다.

개발자의 인증은?

  • 우리 서비스를 누가 쓰는지? 어떻게 사용하는지? 추적이 가능하도록?
    인증에 필요한것은 무엇이 있나요?
  • 아이디 이메일 "비밀번호" 비번이 제일 중요합니다.

비밀번호 어떻게 관리해야하는가? 개인정보보호법에 따라 규정하고있다.
1. Database에 저장시 개인정보를 해싱하여 복원할수 없도록 함.
2. 통신 시 개인 정보를 주고받을 때 SSL을 적용하여 암호화(https) 자물쇠모양이 있는지 확인.

SSL(secure sockets layer)구조

HTTPS

  • ssl 프로토콜 위에서 돌아가는 프로토콜을 의미합니다.
  • s는 over secure socket layer 약자로 secure 보안이 강화된 http라고 생각하면된다. HTTP는 암호화되지 않은 방법으로 데이터를 전송하기 때문에 서버와 클라이언트가 주고 받는 메세지를 감청하는 것이 매우 쉽다.

암호화는 어떻게 할까요?
단방향 해쉬란?

  • 본래 해쉬(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

profile
미래 개발자

0개의 댓글

관련 채용 정보