인증
&인가
는 웹 개발을 하는 사람이라면 기본적으로 알고 있어야 하는 지식! 인증과 인가 절차 및 인증의 필수요소인 패스워드 암호화, JWT에 대해 알아보자!
인증은 유저의 identification을 확인하는 절차이다.
인증이 없으면 사용자 확인 및 식별이 불가하고 추적이 가능하게끔 하기 위함이다.
아이디, 이메일, 주소, 비밀번호 등등 (비밀번호는 법적으로 암호화가 필요)
본래 해쉬함수는 자료구조에서 빠른 자료의 검색, 데이터의 위변조 체크를 위해 쓰인다. 복원이 불가능한 단방향 해쉬함수는 암호학적 용도로 사용한다. ex) MD5, SHA-1 SHA-256
'1234'
→ 03ac67431......
그런데 계속해서 '1234'
를 input으로 넣으면 반복해서 똑같은 값이 나온다. 이런 현상은 위험하기 때문에 SALTING과 Keystretching이 생기게 되었다.
SALTING과 Keystretching
- 단순 해쉬값이 해킹에 쉽게 노출되기 때문에
Salting
이라는 아이디어가 생겨났다.- 입력한 비밀번호와 임의로 생성한 문자열(Salt)를 합쳐서 해싱해서 이 해시값을 저장하는 방법이다. 물론 이 때 비교를 위해 해시값과 소금값을 같이 저장해야 한다.
- 여기에 해커가 패스워드 무작위 대입을 통해 해시값을 계산하는데 필요한 시간을 대폭 늘리기 위해 솔팅 및 해싱을 여러번 반복해서 원본 값을 유추하기 어렵게 만드는 것이
Keystretching
이다.
Salting
과 Key Stretching
을 구현한 해쉬 함수중 가장 널리 사용되는 것이 Bcrypt
이다.(대표적 라이브러리)
Bcrypt는 해시 결과값에 소금값과 해시값 및 반복횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는데 있어 DB설계를 복잡하게 할 필요가 없다.
서버는 사용자가 로그인 했을 경우, 로그인 했다는 것을 어떻게 알까?
- 바로 Headers에 메타데이터를 보내서 확인함.
- 이 메타 정보를 바로 JSON WEB TOKEN(JWT)이라고 함.
앞서 언급했듯이 유저가 로그인에 성공한 후에는 access token
이라고 하는 암호화된 유저 정보를 첨부해서 request를 보내게 된다.
POST /auth HTTP/1.1
Host: localhost:5000
Content-Type: application/json
{
"username": "joe",
"password": "pass"
}
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
}