인증과 인가
- 인증과 인가는 API에서 가장 자주 구현하는 기능이다.
- Private한 API는 물론이고, Public한 API에서도 기본적인 인증과 인가 과정을 요구
인증(Authentication)
- 인증이란 사용자의 Identification을 확인하는 일련의 절차
- 로그인 절차가 인증과정에 해당된다.
- 유저의 아이디와 비밀번호를 만든다.
- 만든 아이디와 비밀번호를 DB에 저장하는데 이때 비밀번호의 경우 암호화를 진행한 후 저장한다.
- 이후 유저가 로그인을 위해서 아이디와 비밀번호를 입력한다.
- 입력된 아이디와 비밀번호를 DB에 저장된 데이터와 비교, 이때에도 입력받은 비밀번호는 암호화 후 비교
- 일치하면 로그인 성공으로 판단
- 클라이언트로 Access Token을 전달
- 유저는 로그인에 성공한 이후에는 Access Token을 첨부하여 Request를 사용하도록 함으로써 로그인을 매번 진행 할 필요가 없도록 할 수 있다.
- 암호화(Encryption)
- 일반적인 데이터(평문)을 일련의 알고리즘을 거쳐서 특정한 사용자만 읽을 수 있도록 하는 절차
- 비밀번호나 중요한 개인정보들은 암호화를 진행한 결과를 DB에 저장하도록 법으로 강제되고 있다.
Bcrypt
- Bcrypt는 단방향 해시 함수를 기반으로 알려져 있는 단방향 해시 함수의 단점을 보완한 암호화 방법
- 단방향 해시 함수는 기반이 암호화를 위한 함수가 아닌 검색을 위한 함수로 만들어졌다.
- 미리 해시 함수의 결과값을 모아놓은 테이블을 사용하는 공격인 Rainbow Table Attack에 굉장히 취약하다.
- Salting과 Key Stretching을 통해서 단점을 보완함
- Salting - 암호화 할 데이터에 임의의 데이터를 추가하여 해시 값을 계산해내는 방법
- Key Stretching - 1회로 해시 계산을 끝내는 것이 아닌 여러 횟수를 반복하는 방법
- 단방향 해시 함수의 단점을 보완하기 위한 여러 함수중 하나가 Bcrypt
- 만들어진 목적부터 암호화를 목적으로 만들어졌다.
JWT(JSON Web Token)
- 먼저 언급한 로그인 성공시에 발행하는 Access Token을 만들어내는 여러 방법 중 하나로 널리 사용되는 기술
- Access Token은 기본적으로 암호화된 데이터이며, 서버에서는 이에 대해서 복호화를 진행하여 어떤 사용자가 Request를 진행한 것인지 파악할 수 있다.
- JWT 기술의 경우, 사용자의 정보를 JSON 포맷에 맞춰 암호화를 진행해서 서버와 클라이언트 간에 주고받는다.
- Access Token을 사용하는 이유
- 간단한 해시 함수를 통해서 성능을 확보할 수 있다.
- 클라이언트의 쿠키 같은 곳에 사용자의 실제 아이디 및 비밀번호를 저장할 필요가 없다. -> 그대로 저장한다면 꽤 위험한 보안 이슈로 작용할 것 같다.
- Access Token은 서버에서만 사용된다.
인가(Authorization)
- 인가란 사용자가 요청한 Request에 대해서 실행할 권한이 있는 사용자인지를 확인하는 절차
- 인가 과정을 JWT를 사용해서 처리할 수 있다.
- 기본적인 인가 절차
- 인증 절차를 통해서 Access Token을 생성한다. 이때 생성하는 Access Token에는 사용자를 특정할 수 있는 정보가 포함되어야 한다.
- 사용자가 Request를 보낼 때 Token을 첨부해서 보낸다.
- 서버에는 사용자가 보낸 Token을 복호화한 후, 사용자 특정 정보를 취득한 후에 DB에서 해당 사용자의 권한을 확인한다.
- 사용자의 권한이 충분하다면 Request를 수행
- 사용자의 권한이 충분하지 않다면, Unauthorized Response - Code 401 또는 다른 에러 코드로 반응한다.
'wecode > TIL 정리' 카테고리의 다른 글
자료구조 TIL - 2. Set, Dictionary, Hash (0) | 2020.08.12 |
---|---|
위코드 Foundation - Bcrypt, JWT 테스트 (0) | 2020.08.12 |
위코드 Pre Course - Django 개념과 흐름 (0) | 2020.08.08 |
위코드 Foundation - HTTP RESTful API의 기본 (0) | 2020.08.08 |
위코드 Foundation - HTTP에 대해서 (0) | 2020.08.08 |