인증은 유저의 identification
을 확인하는 절차이다. 그 절차의 예로 로그인
과 회원가입
이 있다.
🤔 그럼 왜 인증을 왜 하는걸까?
→ 이 중에서 가장 중요한 것은!! 비밀번호 이다.
비밀번호의 관리 🚨
① 통신과정
비밀번호는 법규상으로 DB에 암호화하여 저장이 되도록 강제되는 사항이다. 인증/인가의 과정에서 모든 유저의 데이터들은 통신과정에서 HTTPS, text로 이동하기 때문에 통신내용을 확인하고자 한다면, 무엇이 이동하는지 다 노출 될 수 있다. 그렇기 때문에 이런 개인정보를 주고받을 때에는 SSL을 적용해서 암호화를 해주어야 한다.
② Database에 저장 시
이렇게 통신해서 받아온 비밀번호를 데이터베이스에 저장할 때에는 개인 정보를 해싱하여 복원할 수 없도록 해야한다.
해쉬란? 자료구조의 일종으로, 쉽게말해 해싱을 하면 기존 데이터입력값이 임의의 수학적 계산에 따라 암호화되어 바뀌는것이라고 볼 수 있다.
🤔 그럼 암호화는 어떻게 하는걸까?
원래 hash 함수는 자료구조에서 빠른 자료의 검색, 데이터의 위변조 체크를 위해서 쓰이지만, 복원이 불가능한 이 단방향 해쉬함수는 암호학적 용도로 사용한다.
간단하게 단방향 해쉬를 말해보면, a를 넣으면 a' 가 나오는데, 엄청 복잡하게 바뀌어서 나오는 것을 말한다.
MD5
SHA-1
SHA-256
03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4
로 바뀐다.사용자들끼리는 같은 비밀번호를 사용한다고 하더라도 백엔드는 다르게 저장해줘야 한다! 그래서 나온게 → SALTING & KeyStretching
salting & keystretching
이란? 말 그대로 소금을 쳐서 늘린다는 뜻이다!
🤔 그럼 어떻게 임의로 추가한 salt값을 구분하지?
→ 그래서 DB에 salt 값도 같이 저장해준다! (보안적으로 문제 없다)
👏🏻 이 과정을 조금 더 편하게 할 수 있도록 도와주는 라이브러리가 있는데, bcrypt
이다.
bcrypt
는 Salting & Key Stretching 의 대표적인 라이브러리이다. 📒
access token
을 클라이언트에게 전송.access token
을 첨부해서 request를 서버에 전송함으로서 매번 로그인 해도 되지 않도록 한다.사용자가 서버에 로그인을 하면 → 해당 사용자가 맞는지 확인하는 과정이 인가 (authorization)
이다.
🤚🏻 인가를 계속 알아보기 전에, 먼저 HTTP의 특징을 다시 살펴봐야한다.
HTTP 에서는 각각의 request가 독립적이어서 이전 요청을 기억하지 못한다는 특징이 있었다. 그래서 내가 아까 로그인해서 로그인 시켜줘 놓고(200ok) 다음 요청에서 또 기억을 하지 못한다. (=stateless 한 성질)
→ 그래서! 서버는 토큰을 발행해주고 두번째 요청부터는 발행받은 토큰과 함께 요청을 보내기 때문에 내가 로그인을 한 유저라는것을 알게해줄 수 있다. 💡
이렇게 발행해주는 토큰이 JWT (Json Web Token) 이다.
200OK
와 Token
이 발행되고, Token
과 함께 요청을 보내게 된다.access token
을 생성한다. access token
에는 유저 정보를 확인할 수 있는 정보가 들어가 있어야 한다 (예를 들어 user id).access token
을 첨부해서 보낸다.access token
을 복호화 한다.