인증과 인가

Jina·2020년 4월 15일
0

Session

목록 보기
7/12

인증 (Authentication)

인증 - 회원가입과 로그인을 의미

아이디, 이메일주소, 비밀번호 등이 인증에 필요하고 이 중 비밀번호가 제일 중요
따라서 비밀번호를 잘 관리하는 것이 중요함

비밀번호 관리

  • Database에 저장시 개인정보를 해싱하여 복원할 수 없도록 함
  • 통신시 개인정보를 주고받을 때 SSL을 적용하여 암호화 (HTTPS)

암호화 방법

단방향 해쉬를 사용하여 암호화 함 (단방향 해쉬 --> 복원이 불가능)

해쉬의 단점
해쉬는 원본과 알고리즘이 같으면 동일한 값이 나와서 유추가 가능함. 이러한 허점을 이용하여 가능한 해쉬값의 경우의 수를 테이블로 만들기도 함(rainbowtable)

허점 보완
이러한 허점을 보완하고자 salting과 Key Stretching이라는 방법을 사용함

Salting & Key Stretching

Salting

  • 단순 해쉬값이 해킹에 쉽게 노출되기 때문에 Salting이 생겨남

  • 입력한 비밀번호와 임의로 생성한 문자열(salt)를 합쳐서 해싱 --> 이 해시값을 저장 (이때 비교를 위해 해시값과 salt값을 같이 저장해야함)

Key Stretching

해커가 원본 값 유추하기 어렵게 만들기 위해 Salting 및 해싱을 여러번 반복하는 것

bcrypt

Salting & Key Stretching을 적용해주는 라이브러리


인가 (Authorization)

인가 - 사용자가 서버에 로그인하면 해당 사용자가 맞는지 확인하는 과정

HTTP의 stateless한 성질(저장하지 않는 성질)때문에 서버는 사용자가 요청을 보냈을 때 로그인한 상태임을 알 수 없음 --> request.headers에 사용자 정보 메타데이터를 보내서 확인함

서버와 클라이언트간에 본인확인을 위해 주고 받는 메타정보를 JWT(Json Web Token)라고 함

아래의 사진은 JWT의 구조

  • 토큰의 타입과 해시 알고리즘 정보가 들어감
  • 헤더의 내용은 BASE64 방식으로 인코딩 되어 JWT의 맨앞에 기록됨

Payload (내용)

  • 토큰의 만료시간을 나타내는 공개 클레임 / 비공개 클레임으로 작성되어있음
  • BASE64 인코딩하여 두번째 요소에 위치

Signature (서명)

  • JWT가 원본 그대로라는 것을 확인할 때 사용
  • 인코드된 헤더와 페이로드, 별도로 생성된 JWT secret을 헤더에 지정된 알고리즘으로 암호화하여 전송되며 복호화 가능
  • header와 payload는 인코딩한 것이므로(암호화x) 누구나 원본을 볼 수 있으니 개인정보를 담아서는 안됨

1개의 댓글

comment-user-thumbnail
2020년 4월 17일

👍👍👍👍👍

답글 달기