인증은 user의 identification을 확인하는 절차다. 인증에 앞서 필요한 과정을 먼저 살펴보자.
[ 로그인 절차 ]
- 아이디 & 비밀번호 생성
- 비밀번호 암호화해서 DB에 저장
- 로그인시 아이디 & 비밀번호 입력
- 유저가 입력한 비밀번호 암호화 후 DB에 저장된 비밀번호와 비교
- 일치 ? 로그인 성공(access token 전송 & 재로그인 필요 X)
로그인 기능을 구현하기 위해 해야 할 비밀번호 암호와와 access token 발행을 어떻게 하는지 자세히 알아보자.
비밀번호 암호화
- 비밀번호를 암호화하면 DB가 해킹을 당해도 비밀번호가 그대로 노출되지 않고, 내부 인력도 비밀번호를 알 수가 없다는 보안상 장점이 있다.
- 비밀번호 암호화는 일반적으로 단방향 해쉬 함수가 쓰인다. 단방향 해쉬 함수는 다이제스트(암호화된 메세지)를 생성하는데, 원본 메세지를 알면 암호화된 메세지를 구하기 쉽지만 암호화된 메세지로 원본 메세지를 구할 수 없어 해킹을 어렵게 만든다.
취약점
- Rainbow table attack : 미리 해쉬값들을 계산해 놓은 테이블을 사용하여 공격 가능
- 해쉬 함수의 본 목적은 짧은 시간에 데이터를 검색하기 위한 것 : 빠른 속도로 해킹할 다이제스트를 비교해 해킹할 수 있다.
이러한 취약점을 보안하기 위해 일반적으로 Salting과 Key Stretching 두 가지 방법이 사용된다.
- Salting : 실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해 해시값을 계산하는 방법으로, 비밀번호를 알기 어렵게 하기 위해 만들어놓는 노이즈라고 생각하면 된다. 입력한 비밀번호와 임의로 생성한 문자열(Salt)를 합쳐서 해싱해서 이 해시값을 저장한다. 이 때 비교를 위해 해시값과 Salt값을 같이 저장해야 한다.
- Key Stretching : 단방향 해쉬값을 계산하고 나서 그 해쉬값을 해쉬하는 것을 반복하는 방법이다.(salt와 hashing 반복) 해커가 패스워드 무작위 대입을 통해 해시값을 계산하는데 필요한 시간을 대폭 늘리기 위해 Salting 및 해싱을 여러번 반복해서 원본 값을 유추하기 어렵게 만든다.
Salting과 Key Stretching을 구현한 함수 중 가장 널리 사용되는 것은 bcrypt다.
[ bcrypt 사용하기 ]
https://velog.io/@dabin0219/%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EC%95%94%ED%98%B8%ED%99%94
다시 로그인 절차로 돌아가보자. 로그인에 성공하면 access token을 유저에게 발행되고, 서버에서는 이를 복호화해서 해당 유저 정보를 얻는다. 이 절차를 통해 유저가 매번 로그인 하지 않아도 되게 만든다. 인가와 마찬가지로 JWT(JSON Web Tokens)를 사용할 수 있다.
[ JWT와 인가 ]
https://velog.io/@dabin0219/TIL-33-%EC%9D%B8%EA%B0%80