- 인증, 인가에 대해 설명할 수 있다.
- 단방향 해쉬가 무엇인지 설명할 수 있다.
- salting & key stretching이 무엇인지 설명할 수 있다.
- Bcrypt와 JWT가 무엇인지 설명할 수 있다.
▪️ 인증과 인가는 API에서 가장 자주 구현되는 기능 가운데 하나입니다.
▪️ Private한 API는 물론이고 Public한 API도 기본적인 인증과 인가를 요구합니다.
Authentication은 유저의 identification을 확인하는 절차이다.(유저의 아이다와 비번을 확인하는 절차). 인증을 하기 위해선 먼저 유저의 아이디와 비번을 생성할 수 있는 기능이 필요하겠죠?
access token
을 클라이언트에게 전송.access token
을 첨부해서 request를 서버에 전송함으로서 매번 로그인 해도 되지 않도록 한다.🔴 유저의 비밀번호는 절대 비밀번호 그대로 DB에 저장하지 않는다.
🔴 유저의 비밀번호는 꼭 암호화 해서 저장해야 한다.
🔴 비밀번호 암호에는 단방향 해쉬 함수(one-way hash function)가 일반적으로 쓰인다.
다이제스트(digest)
를 생성한다. 원본 메시지를 알면 암호화된 메시지를 구하기는 쉽지만 암호화된 메시지로는 원본 메시지를 구할 수 없어서 단방향성(one-way)
이라고 한다.d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb
값이 나온다. 실제 비밀번호는 비슷하지만 해쉬 함수 값은 완전히 틀린것을 볼 수 있다. 이러한 효과를 avalance라고 하는데 비밀번호 해쉬 값을 해킹을 어렵게 만드는 하나의 요소이다.In [21]: import hashlib In [22]: m = hashlib.sha256() In [23]: m.update(b"test password") In [24]: m.hexdigest() Out[24]: '0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e' In [25]: m = hashlib.sha256() In [26]: m.update(b"test password2") In [27]: m.hexdigest() Out[27]: 'd34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb'
🔅 단방향 해쉬 함수도 몇가지 취약점이 있다.
🔅 단방향 해쉬 함수의 취약점들을 보완하기 위해 일반적으로 2가지 보완점들이 사용된다.
In [40]: import bcrypt In [41]: bcrypt.hashpw(b"secrete password", bcrypt.gensalt()) Out[41]: b'$2b$12$.XIJKgAepSrI5ghrJUaJa.ogLHJHLyY8ikIC.7gDoUMkaMfzNhGo6' In [42]: bcrypt.hashpw(b"secrete password", bcrypt.gensalt()).hex() Out[42]: '243262243132242e6b426f39757a69666e344f563852694a43666b5165445469397448446c4d366635613542396847366d5132446d62744b70357353'
access token
이라고 하는 암호회된 유저 정보를 첨부해서 request를 보내게 된다.- 유저 로그인
POST /auth HTTP/1.1 Host: localhost:5000 Content-Type: application/json { "username": "joe", "password": "pass" }
- access token
HTTP/1.1 200 OK Content-Type: application/json { "access_token" : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E" }
access token
을 복호화 해서 해당 유저 정보를 얻게 된다.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E
를 복호화 하면 다음과 같은 정보를 얻는다.{ user_id = 1 }
access token
을 생성하는 방법은 여러가지가 있는데, 그 중 가장 널리 사용되는 기술중 하나가 바로 JWT(JSON Web Token)이다.1-5. Why Use Access Token VS ID and Password?
1-1. 인가(Authorization)
🔹 Authorization은 유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차이다.
🔹 예를 들어, 해당 유저는 고객 정보를 볼 수는 있지만 수정 할 수는 없다 등.
🔹 Authorization도 JWT를 통해서 구현 될 수 있다.
access token
을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한(permission)도 확인 할 수 있다.access token
을 생성한다. access token
에는 유저 정보를 확인할 수 있는 정보가 들어가 있어야 한다.(예를들어 user id)access token
을 첨부해서 보낸다.access token
을 복호화(사람이 읽을 수 있는 형태)한다.