TIL 20. 인증 & 인가

sooo·2020년 10월 25일
0

인증과 인가

인증(authentication)과 인가(authorization)는 API의 필수적인 기능 중 하나이다. 인증과 인가는 특정 API에 대하여 해당 사용자 또는 클라이언트가 유효한(권한이 있는)지를 확인하고, 권한을 부여하는 과정이다. 이 때 권한을 부여하기 위해 백엔드에서는 access token을 발행한다. 사용자는 이 토큰을 들고다니면서 자신이 해당 사용자가 맞음을 확인받는다. HTTP는 stateless이기 때문에, 즉 전에 이 사용자가 인증을 받았음을 기억하지 못하기 때문에 권한이 필요한 API와 통신할 때마다 이러한 확인 절차가 필요하다. (이 때 decorator함수를 사용할 수 있다.)

인증의 대표적인 예는 바로 로그인이다. 사용자가 회원가입을 하면 서버는 그 정보를 받아서 DB에 저장한다. 이때 비밀번호는 절대로 그대로 저장하지 않고 '암호화'하여 저장한다. 이후 사용자가 로그인을 시도하면 그 정보가 DB에 저장된 정보와 맞는지를 확인한다. 정보가 일치한다면 백엔드에서는 토큰을 발행할 것이다. 프론트엔드에서는 이 access token을 스토리지에 저장해두고, 그 다음부터는 HTTP request를 보낼 때 토큰을 함께 첨부해서 보낸다. 백엔드에서는 이 access token을 확인해서 사용자가 이미 로그인한 상태임을 알 수 있다.

암호화와 단방향 해쉬

사용자의 비밀번호를 DB에 저장할 때는 암호화 절차가 필요하다. 이것은 내부 혹은 외부적 요인에 의해서 데이터베이스가 노출될 경우에 대비하기 위한 것이다. 굳이 해킹이 아니더라도 데이터베이스 자체는 권한만 있으면 내부에서 누구나 접근할 수 있기 때문에 비밀번호를 그대로 저장하는 것은 매우 위험한 일이다.

비밀번호를 암호화하기 위해서 단방향 해쉬(one-way hash function)라는 것을 사용한다. 단방향이라는 말은 비밀번호를 암호화할 수 있을 뿐 원래의 값으로 복호화할 수 없다는 의미이다. 보통 많이 사용되는 단방향 해쉬 알고리즘은 SHA-256이다. 비밀번호를 복호화할 수 없으면 인증을 어떻게 할 수 있을까?? 사용자가 로그인할 때 비밀번호를 입력하면, 이 비밀번호를 다시 암호화해서 DB에 저장된 암호화된 비밀번호와 비교하면 된다.

하지만 단방향 해쉬 알고리즘도 해킹이 불가능한 것은 아니다. 레인보우 테이블 공격(rainbow attack)이라는 것이 있다. 레인보우 테이블은 미리 가능한 모든 조합들을 해시하여 테이블에 저장해놓고 이를 하나하나 대입하는 것이다. 상식적으로 생각해도 그 조합의 양은 엄청나게 방대하겠지만 시간의 문제일 뿐 해킹이 불가능하지는 않을 것이다. 그리고 비밀번호의 길이가 짧거나 단순할 경우 해킹하는데 걸리는 시간은 더 줄어든다.

이러한 단방향 해쉬 함수의 취약점을 보완하기 위해서 salting과 key stretching이라는 두 가지 방법이 사용된다.

  1. Salting
    음식에 소금을 치는 것처럼, 비밀번호에 추가적인 값을 더해서 해시하는 것이다.

  2. Key Stretching
    단방향 해시를 한 번만 하는 것이 아니라 그 해시 값을 또 해시하고 여러 번 반복하는 것이다.

0개의 댓글