- 인증은 회원가입과 로그인을 말한다.
- 사용자가 서비스 제공자에게 자신을 증명하는 것.
- 개발자 입장에서는 우리의 서비스를 누가 쓰고 어떻게 사용하는지 등이 추적하기위해 필요하다.
- 인증에는 아이디, 이메일주소, 비밀번호 등이 있으며, 이중에 가장 중요한 것은 비밀번호다.
1) database에 저장시 개인 정보를 해싱하여 복원할 수 없도록 함
2) 통신 시 개인 정보를 주고 받을 때 SSL(인증서)을 적용하여 암호화 (HTTPS)
해쉬(hash)함수는 자료구조에서 빠른 자료의 검색, 데이터의 위변조 체크를 위해서 쓰인다. 복원이 불가능한 단방향 해쉬함수는 암호학적 용도로 사용한다. 결과적으로 당장 식별이 불가능하지만, 같은 알고리즘으로 다시 해싱하면 항상 같은 결과가 나오기 때문에 역추적이가능하다. 이때 가능한 경우의 수를 모두 해시값으로 만들어놓은 것을 레인보우 테이블이라고 한다.
역추적이 가능하다는 허점을 보완하기위해 salting과 Key Stretching이라는 개념이 등장 했다.
입력한 비밀번호와 임의로 생성한 문자열(Salt)를 합쳐 해싱한 값을 저장하는 방법이다. 이때, 비교를 위해 해시값과 Salt값을 같이 저장해야한다.
여기에 해커가 패스워드 무작위 대입을 통해 해시값을 계산하는데 필요한 시간을 대폭 늘리기 위해 Salting 및 해싱을 여러번 반복해서 원본 값을 유추하기 어렵게 만드는 것을 Key Stretching이라고 한다.
salting & Key Stretchingt의 대표적인 라이브러리
bcrypt는 해쉬 결과값에 salt값과 해쉬값 및 반복횟수를 같이 보관하기 때문에 비밀번호에 해싱을 적용하는데 있어 DB설계를 복잡하게 할 필요가 없다.
인가란 사용자가 서버에 로그인을 하면 해당 사용자가 맞는지 확인하는 과정을 말한다. HTTP의 stateless 특징으로 인해 필요한 과정이다.
(로그인한 사람이 추가적인 서비스를 이용할때 토큰을 가지고 서비스를 이용하는 과정?)
서버는 사용자가 로그인을 했을 때, 로그인 했다는 것을 headers에 메타데이터를 보내서 확인 할 수 있다. 이 메타정보를 바로 JWT(JSON Web Token)이라고 한다.
인증은 회원가입하고 로그인하는 과정까지를 말하고,
인가는 로그인한 사람이 추가적인 서비스를 이용할때 부여받은 토큰을 가지고 서비스를 이용하는 과정을 말한다.