인증(Authentication)
Authentication은 유저의 identification을 확인하는 절차입니다.
쉽게 설명하면, 유저의 아이디와 비번을 확인하는 절차.
인증을 하기 위해선 먼저 유저의 아이디와 비번을 생성할 수 있는 기능도 필요합니다.
코드를 보면서 설명해보겠습니다.
class MainView(View):
def post(self, request):
data = json.loads(request.body)
if len(data['password']) < 5:
return JsonResponse({'message': '비밀번호는 5자 이상이어야합니다.'}, status=400)
try:
signup = User(
email = data['email'],
password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
)
if User.objects.filter(email=data['email']).exists():
return JsonResponse({'message': '이미 가입된 이메일주소 입니다.'}, status=400)
elif '@' not in data['email']:
return JsonResponse({'message': '이메일 형식으로 입력해주세요.'}, status=400)
else:
signup.save()
return JsonResponse({'message':'SUCCESS'}, status=200)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
Post를 통해 가입요청을 받으면 가입형식에 맡게 입력되었는지 확인하고 가입을 진행합니다.
class Signin(View):
def post(self, request):
data = json.loads(request.body)
if User.objects.filter(email=data['email']).exists():
user = User.objects.get(email=data['email'])
check = bcrypt.checkpw(data['password'].encode('utf-8'), user.password.encode("utf-8"))
if check == True:
id_value = User.objects.get(email=data['email'])
ids = id_value.id
print(ids)
token = jwt.encode({'user-id':ids}, 'secret', algorithm='HS256')
d_token = jwt.decode(token, 'secret', algorithm='HS256')
return JsonResponse({'access_token': token.decode('utf-8')}, status=200)
return JsonResponse({'message':'INVALID_USER'}, status=400)
로그인시 기존에 가입되어 있는 아이디 혹은 이메일인지 확인 후 비번까지 같으면 로그인 성공 리스폰스를 보내줍니다. 이 과정이 인증입니다.
인가(Authorization)
Authorization은 유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차입니다.
예를 들어, 해당 유저는 고객 정보를 볼 수 있는 있지만 수정 할 수는 없다 등.
Authroization도 JWT를 통해서 구현 될 수 있습니다.
access token을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한(permission)도 확인 할 수 있다.
위에 로그인 시 기존에 회원가입시 비밀번호를 암호화하여 저장할 때 처럼 비밀번호를 암호화하여 비교 로그인을 진행하고 JWT 토큰을 보내 프론트엔드에서 활용 할 수 있도록 합니다.