본문 바로가기
  •                        自分に負けずやれば出来る
  • 自分を信じる
Computer/Web Programming

[Authentication] 인증

by Divertome 2021. 4. 13.

 

private한 api는 물론이고 public한 api역시 기본적인 인증을 요구한다. private api의 경우 접근 가능한 클라이언트를 제한해야함으로 당연히 인증 엔드포인트를 구현해야하지만, public의 경우 역시 접근 횟수 제한, 남용 방지, 통계등의 이유로 인증엔드포인트가 필요하다.

기본적으로 가입 시 사용자의 아이디를 그 대로 데이터베이스에 저장하지 않고 암호화 시켜서 저장한다. 이 때 주로 단방향 해시 함수를 사용하는데, 이렇게 암호화해서 저장하는데는 크게 두가지의 이유가 있다.

첫번째 실제 해커에게 데이터베이스가 해킹당할 경우 모든 사람의 개인정보 및 비밀번호가 유출되는데 사람들은 보통 여러 사이트의 비밀번호를 똑같은 것으로 설정해서 사용하기 때문에 더 큰 피해로 번질 가능성이 크다. 그렇기에 데이터베이스가 유출되더라도 최소한의 비밀번호를 지킴으로써 더 큰 피해를 막는 효과가 있다.

두번째로 실제 해커가 아니더라도 내부 개발자에 의해 유출이 일어날 가능성을 차단하기 위해서이다. 예를 들면 내부 개발자 A씨의 전 여자친구가 A씨가 운영중인 서비스에 가입했다고 쳤을 경우 A씨는 다른 동료 개발자들 몰래 개인의 복수를 위해 정보를 활용할 가능성이 있다. 이런 두가지의 경우를 사전에 막기 위해 비밀번호 암호화 과정을 거치게 된다.

좀 전에 말했듯이 단방향 해시함수를 사용해서 암호화를 하는데 문제가 있다. 우선 해시함수는 그 자체로 성능이 매우 빠른 알고리즘으로써 요즘 개인 컴퓨터로도 초당 50억개의 해시값을 비교가 가능해서 해커가 가능한 패스워드 조합을 가지고 미리 해시 테이블을 만든 뒤 비교를 할 가능성이 있다.(rainbow attack) 따라서 단방향 해시함수만으로도 충분한 보안이 이루어지지 않기때문에 추가적인 방안이 나오게 되었다.

대표적인 것이 다음 두가지이다. salting과 key stretching

salting은 말그대로 요리하다가 마지막에 소금을 넣듯이 입력받은 사용자의 패스워드에 임의로 랜덤값을 넣어 해시화를 진행하여 혹시나 해킹당하여도 어디가 실제 비밀번호인지 어디가 랜덤값인지 알수가 없도록 하는 방법이다.

두번째 key stretching은 해시값을 한번더 해시하고 또 해시하고 여러번 반복하면서 해커가 아무리 빠른 컴퓨터를 가져와도 연산속도를 느리게해서 해시알고리즘의 빠른 장점을 이용하지 못하도록하는 것이다.

이두가지를 구현하여 만든 해시 함수 중 가장 많이 사용되는 것이 bcrypt이다.