인증 & 인가

박상영·2020년 6월 16일
0

인증(Authentication), 인가(Authorization)

  • 인증과 인가는 API에서 가장 자주 구현되는 기능중 하나이다.
  • Private한 API는 물론이고 Public한 API도 기본적인 인증과 인가를 요규한다.

인증(Authentication)

  • Authentication 은 유저의 identification을 확인하는 절차다.
  • 쉽게 설명하면, 유저의 아이디와 비번을 확인하는 절차.
  • 인증을 하기 위해선 먼저 유저의 아이디와 비번을 생성할 수 있는 기능도 필요하다.

로그인 절차 (비밀번호와 주민번호 암호화 하는것은 다르다.)

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

인가(Authorization)

  • 사용자가 서버에 로그인 하면 해당 사용자가 맞는지 확인하는 과정이 인가 다.
  • Http의 특징은 무엇일까?
    바로 request/response 요청과 응답.
    stateless한 성질(저장하지 않는 성질).
  • 위의 특징때문에 서버는 사용자가 로그인 했을경우, 로그인 했다는 것을 어떻게 알 수 있을까?
    바로 headers에 메타데이터를 보내서 확인한다.
  • 이 메타정보를 바로 JSON Web Token 일명'JWT'라고 한다.

JSON Web Token

  • 위의 그림은 JWT의 구조입니다.
  • header에는 어떤 정보가 들어갈까요?
    토근의 타입과 해시알고리즘 정보가 들어갑니다.
    header 의 내용은 BASE64 방식으로 incoding해서 JWT의 가장 첫 부분에 기록됩니다.
  • 예시 - {"alg":"HS256", "typ": "JWT"}

payload(내용)

  • 내용에는 exp와 같이 만료시간을 나타내는 공개 클레임
  • 그리고 client와 server간 협의하에 사용하는 비공개 클레임
  • 위의 두가지 요소를 조합하여 작성한뒤 BASE64 인코딩하여 두번째 요소로 위치한다.
  • 예시 - {"user-id":1, "exp":1539517391}

signature(서명)

  • JWT가 원본 그대로라는 것을 확인할 때 사용하는 부분이다.
  • 시그니쳐는 BASE64URL 인코드된 header 와 payload 그리고 JWT secret(별도 생성)을 헤더에 지정된 암호 알고리즘으로 암호화하여 전송.
  • 프론트엔드가 JWT를 백엔드 API 서버로 전송하면 서버에서는 전송받은 JWT의 서명부분을 복호화하여 서버에서 생성한 JWT가 맞는지 확인한다.
  • 마치 계약서의 위변조를 막기위해 서로 사인하는 것과 같다고 보면 된다.
  • 주의할 점은 header와 payload는 BASE64 인코딩한 것이므로(암호화 아님) 누구나 원본을 볼 수 있으니 개인정보를 담아서는 안된다.

bcrypt

Salting & Key Stretching 대표적 라이브러리

  • bcrypt는 앞서 말한 개념들을 실제로 적용하기 편하게 해주는 대표적인 라이브러리 이다.

  • 다양한 언어를 지원하고 있으며, 사용이 간편하여 쉽게 적용이 가능하다.

  • bcrypt는 hash결과값에 salt값과 hash값 및 반복횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는데 있어 DB설계를 복잡하게 할 필요가 없다.

  • bcrypt를 통해 해싱된 결과 값(Digest)의 구조는 아래와 같다.

profile
backend

0개의 댓글