[220831] JWT 토큰 사용하기[1]
# JWT 토큰 사용 및 인증과 인가
1. 인증과 인가
2. JWT인증 관련
3. bcrypt
Django에서 로그인과 회원가입 회원탈퇴에 사용할 JWT토큰 사용법 및 인증과 인가에 대해서 알아보자.
먼저 인증 Authentication 과 인가 Authorization 란 무엇일까?
인증과 인가는 API에서 자주 구현되는 기능들 중 하나이다.
- 인증 : 사용자의 신원을 확인하는 절차이다. 사용자의 id와 password를 받아서 등록된 사용자가 맞는지 검증하는 것이다.
- 인가 : 인증이 로그인 과정이라면 인가는 인증이 완료된 사용자에게 권한을 주는 것이다.
인증 Authentication 이란?
인증이란 유저 아이디와 비밀번호를 확인하는 절차를 가리키며, 쉽게 로그인하는 과정을 생각하면 된다.
인증을 위해서는 아이디/비번을 생성할 수 있는 회원가입 기능 또한 필요하다.
인증절차는 어떻게 될까?
# 로그인의 과정
1. 회원가입을 통한 ID 아이디/PW 비밀번호 생성
2. 비밀번호 암호화 > Database 저장
3. 유저 로그인 : ID 와 PW 입력
4. 비밀번호 확인 : 비밀번호를 암호화 한 뒤 DB의 암호와 같은지 확인한다. 일치하면 로그인 성공!
5. 로그인 성공 > access token을 클라이언트에게 전달
6. 발급받은 access token을 통해 로그인 유지 및 서비스 사용
로그인을 하기 위해서 우리는 먼저 ID와 Password를 DB에 저장해야 한다.
즉, 회원가입을 통해 아이디와 비밀번호를 DB에 저장하게 되며, DB에 저장된 정보와 로그인 시 입력하는 값이 같을 경우
인증 절차가 정상적으로 끝나게 된다.
이 과정에서 우리가 꼭 알아야 하는 것은
- DB에 저장되는 비밀번호는 암호화를 거친 상태라는 것과
- 로그인 인증을 받으면 access token을 통해 서비스를 이용하게 된다는 것이다.
그렇다면 암호화 된 비밀번호의 비밀번호는 어떻게 암호화 되는 것일까?
먼저 단방향 해쉬함수를 사용한 암호화가 있다.
단방향 해쉬 함수를 사용한 암호화는 한번 암호화 된 정보는 되돌릴 수 없다.
그렇기 때문에 DB에 저장된 암호화 된 비밀번호와 로그인 시 입력받은 비밀번호를 암호화 하여 동일한지 확인하고,
동일하다면 로그인이 진행된다.
하지만 단 방향 해쉬 함수는 입력값에 대한 결과값이 정해져 있어 역추적이 가능하다는 취약점이 있다.
두 번째로는 Bcrypt를 사용하는 것이다.
bcrypt는 비밀번호를 위해 만들어진, 단방향 해쉬함수의 취약점을 보완한 암호화 방법이다.
- Salting은 실제 비밀번호 이외에 랜덤데이터를 추가하여 해시값을 늘린다.
그래서 암호의 길이를 늘린 후 역추적의 경우의 수를 늘려 해쉬테이블을 만들지 못하도록 한다. - Key Stretching을 사용하는데 단방향 해쉬함수를 여러 번 반복해서 해시값을 계산하는 방법이다.
key stretching은 암호화 하는 속도를 늦춰 로그인 시 지연이 살짝 발생할 수 있다.
하지만 컴퓨터의 성능이 향상되는 만큼 암호화 반복횟수를 늘려 암호화 보완이 가능하다.
JWT란?
JWT 는 (JSON Web Token)으로 JSON 구문으로 작성된 웹 토큰, 로그인에 성공하게 되면 access token을 발급받는다.
access token에는 몇 가지 종류가 있지만 가장 많이 사용하는 기술중 하나가 JWT이다.
JWT는 유저정보를 담은 JSON데이터를 암호화하여 클라이언트와 서버간에 주고 받게 된다.
JWT발급과 사용
1. 사용자 회원가입
2. 인증서버에서 JWT생성
3. 사용자에게 JWT 전달
4. 사용자는 JWT를 통해 서비스 이용
인가 Authorization 란 무엇인가?
사용자가 요청을 실행할 수 있는 권한이 있는지 확인하는 절차이다.
JWT를 통해 구현하고 access token으로 사용자 정보를 얻을 수 있으므로 권한을 확인 가능하다.
유저는 요청을 보낼 때 encoding 된 access token을 함께 첨부하며, 서버는 access token을 decoding을 통해 데이터를 확인, 유저 정보를 얻는다. 서버에서 해당 유저 정보를 통해 권한(permission)을 확인하며 해당 요청을 처리하게 된다.