언제나 궁금했던 인증 & 인가 정리

Maria Kim·2021년 11월 22일
0

인증 Authentication

필요한 이유

  • 사용자별 구분을 위해, 우리 서비스를 어떻게 사용하는지, 등을 추적하기 위해서 사용

인증에 필요한 것은?

  • 아이디, 이메일주소, 비밀번호
  • 가장 중요한 것 !! -> 비밀번호

로그인 절차

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

하지만 중요한 만큼 보호가 필요하다!!

암호화 이유

  1. 법적으로 특정 사람임을 알 수 있는 비밀번호나 바이오 정보들은 암호화 해야함
  2. DB 가 해킹 당하면 유저의 비밀번호도 그대로 노출 된다.
  3. 내부 개발자나, 관계자가 비밀번호를 볼 수 있다.

암호화

단방향 해쉬

  • 해쉬 함수는 빠른 검색을 위해 자료구조 종류 중 하나로 쓰이고 있고, 데이터의 위변조 체크를 위해서도 쓰임.
    -> + 복원이 불가능한 단방향 해쉬함수는 암호학적 용도로도 쓰임

  • 종류 : MD5, SHA-256 -> 보안 취약 / SHA-256

문제점

  • But!! 같은 알고리즘으로 같은 값을 해싱하면 항상 같은 결과가 도출되는 문제가 있음.

해결방법

Salting

  • 단순 해쉬값이 해킹에 쉽게 노출되기 때문에 salting 이라는 것이 등장함.
  • 방법 : 비밀번호 + 임의로 생성한 문자열(salt) => 해싱 => 이 해싱 값을 저장
  • 이때 비교를 위해 해시값과 salt 를 같이 저장 해야함

Key Stretching

  • 해커가 패스워드 무작위 대입을 통해 해시값을 계산하는데 필요한 시간을 대폭 늘리기 위해 나옴
  • 방법: 비밀번호 + 임의로 생성한 문자열(salt) => 해싱 -> 부분을 여러번 반복함

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

  • 다양한 언어를 지원, 사용이 간편하여 쉽게 적용이 가능
  • hash 결과값에 소금값과 해시값 및 반복횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는데 있어 DB설계를 복잡하게 할 필요가 없다.

인가 Authorization

  • 사용자가 서버에 로그인 하면 해당 사용자가 맞는지 확인하는 과정
  • Authroization도 JWT를 통해서 구현 될 수 있다.
  • access token을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한(permission)도 확인 할 수 있다

JST(JSON Web Tokens)

  • access token을 생성하는 방법은 여러가지가 있는데, 그 중 가장 널리 사용되는 기술중 하나가 바로 JWT(JSON Web Tokens)이다.
  • 유저 정보를 담음 JSON 데이터를 암호화 해서 클라이언트와 서버간에 주고 받는 것

    aaaa(header).bbb(payload).ccc(signature)

Authorization 절차

  1. Authentication 절차를 통해 access token을 생성한다. access token 에는 유저 정보를 확인할 수 있는 정보가 들어 있어야 한다(유저 아이디 같은...)
  2. 유저가 이제부터 request 를 보낼때 access token를 첨부해서 보낸다.
  3. 서버에서는 유저가 보낸 access token를 복호화 한다.
  4. 복호화한 데이터를 통해 user id 를 얻는다.
  5. user id 를 사용해서 database 에서 해당 유조의 권한을 확인한다.
  6. 유저가 충분한 권한을 가지고 있으면 해당 요청을 처리한다.
  7. 유저가 권한을 가지고 있지 않으면 Unauthorized Response(401) 혹은 다른 에러 코드를 보낸다.
profile
Frontend Developer, who has business in mind.

0개의 댓글