인증과 인가

mokyoungg·2020년 5월 19일
0

해당 내용의 모든 출처는 부트캠프 위코드입니다.
https://wecode.co.kr/

인증 & 인가

  • 인증과 인가는 API에서 가장 자주 구현되는 기능
  • Private한 API는 물론, Public한 API도 기본적인 인증과 인가를 요구

1. 인증(Authentication)

  • 인증은 유저의 identification을 확인하는 절차다.
  • 유저의 아이디와 비번을 확인하는 절차.

로그인 절차

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

2. 유저 비밀번호 암호화

  • 유저의 비밀번호는 절대 비밀번호 그대로 DB에 저장되지 않는다.
    -DB 해킹시, 비밀번호가 그대로 노출됨
    -내부 개발자나 인력이 유저의 비밀번호를 봄

따라서 유저의 비밀번호는 꼭 암호화

  • 비밀번호 암호에는 단방향 해쉬 함수(one-way hash function)가 일반적으로 쓰임
    -단방향 해시 함수는 원본 메시지를 변환하여 암호화된 메시지(다이제스트)를 생성.
    -암호화된 메시지를 구해도, 원본 메시지를 구할 수 없어 단방향성(one-way)이라고 함

3. Bcrypt

  • 단방향 해쉬 함수도 취약점이 있다.
  • Rainbow table attack - 미리 해쉬값들을 계산해 놓은 테이블.
    -해시 함수는 원래 패스워드를 저장하기 위해서 설계된 것이 아니라 짧은 시간에 데이터를 검색하기 위해 설계 된것.
    -이러한 속성 때문에 공격자는 매우 빠른 속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트를 비교
  • 단방향 해쉬 함수의 취약점을 보완하기 위해 2가지 보완점들이 사용된다.

salting

  • 실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시값을 계산하는 방법

Key Stretching

  • 단방향 해시값을 계산한 후, 그 해쉬값을 또 해쉬고하고.. 이를 반복하는 것.

Salting과 Key Streching을 구현한 해쉬 함수 중 가장 널리 사용되는 것이 bcrypt이다.

4. JWT

  • 로그인 성공 후, access token이라는 암호화된 정보를 첨부하여 request를 보냄.
  • 서버에서는 access token 을 복호화해서 해당 유저 정보를 얻게 됨.
  • 복호화해서 얻은 유저 아이디를 통해 해당 유저가 누군지 알게 됨.
  • access token을 생성하는 방법은 여러가지가 있는데, 그 중 가장 많이 사용되는 것이 JWT

JWT(JSON Web Tokens)는 말 그대로 유저 정보를 담은 JSON 데이터를 암호화해서 클라이언트와 서버간에 주고 받는 것이다.

5. 인가(Authorization)

  • 인가는 유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차

인가절차

  1. 인가 절차를 통해 access token을 생성. access token에는 유저 정보를 확인정보 있음(id 등)
  2. 유저가 request를 보낼 때 access token을 첨부해서 보냄
  3. 서버에서, 유저가 보낸 access token을 복호화
  4. 복호화된 데이터를 통해 user id를 얻음.
  5. user id를 사용하여 DB에서 해당 유저의 권한을 확인
  6. 유저가 권한을 가지고 있으면 요청을 처리
  7. 유저가 권한이 없으면 401 혹은 다른 에러 코드를 보낸다.


  1. 인증이란?
    유저의 신원을 확인하는 절차

  2. 비밀번호 암호화는 어떻게 이루어지는가?
    단방향 해시 함수, 원본 메시지를 변환하여 암호화된 메시지를 생성

  3. 단방향 해쉬함수 그리고 레인보우 테이블 어택
    일반적인 단방향 해시함수의 취약점.
    미리 해시값을 계산해 놓은 테이블(레인보우 테이블)에 의해 공격 당할 수 있음

  4. 솔팅과 키스트레칭 그리고 bcryt
    단방향 해시함수의 취약점을 보완하기 위한 방법으로
    솔팅은 기존 비번에 추가적으로 랜덤 데이터를 더하여 계산
    키스트레칭은 단방향 해시값 계싼후 그 값을 해시하고 해시하고.. 반복함(길어짐)

  5. 인가란?
    유저가 요청하는 응답을 실행할 수 있는 권한이 있는가 확인하는 절차

  6. JWT는?
    JSON Web Tokens, 유저 정보를 담은 JSON 데이터를 암호화하여 클라이언트와 서버간에 주고 받는 것.


이런 절차?
클라이언트 요청 - 인증 - 비밀번호 암호화(bcrypt) - JSON 데이터(access token 전달) - 비밀번호 복호화 - 인가 - 요청 응답

profile
생경하다.

0개의 댓글