인증과 인가가 뭐지 ??
인증과 인가가 뭐지 ??
토큰 기반 인증과 세션 기반 인증을 살펴보기위한 기본 배경지식의 학습내용입니다.
인증과 인가
인증 (Authentication)
- 유저가 누구인지 확인하는 절차. 회원가입을 하고 로그인하는 것을 말한다.
- 유저의 identification을 확인하는 절차
인가(Authorization)
- 유저에 대한 권한을 허락하는 것. 유저마다 다른 권한을 갖고 있다. 인가는 권한을 확인하는 것이다.
- JWT(JSON WEB TOKEN)과 같은 토큰을 이용하여 인가를 할 수 있다.
인증 & 인가가 왜 필요할까?
- 서비스를 누가, 언제, 어떻게 쓰고 있는가를 파악하고 관리하기위해 필요 !
인증을 하기위해 필요한 것
- 인증을 하기 위해서 먼저 유저의 아이디와 비밀번호를 생성할 수 있는 기능이 필요하다.
- 따라서 유저의 비밀번호를 관리해야하고 DB 탈취 등의 노출과 개인의 암호를 그 누구에게도 노출하지 않기위해 해싱과 같은 관리가 필수적이다.
- 일반적으로 단방향 해쉬함수로 비밀번호를 관리하며 Bcrypt가 대표적 라이브러리다.
Bcrypt
- Salting & Key Stretching 대표적 라이브러리
- 단방향 해쉬함수의 단점은 하나의 값에 대한 결과값(해싱값)이 똑같다는 것인데 보완을 위해 Salting과 Key Stretching가 필요하다.
Salting & Key Stretching
- Key Stretching은 다이제스트(해싱한 결과물)을 다시 한번더 해싱을 하는 방법을 얘기한다. 이 방식을 이용하면 해싱을 돌리는 횟수을 아는 사람만이 해독할 수 있으며 해커가 안다고해도 최종 다이제스트의 원문 메시지를 얻기 위해서 소모되는 시간이 더 많이 소요되므로 포기하게 만든다.
- 결과적으로 Key Stretching은 해커에게 레인보우 테이블(해싱의 결과 값을 모아놓은 테이블)가 있으면 해커는 어떻게든 알아낼 수 있으므로 무차별 대입(브루드 포스)와 같은 해킹 방법을 막는 방법이다.
- Salting은 각 횟수별 다이제스트에 대한 레인보우 테이블을 갖고 있는 상황과 같은 문제를 해결하기 위해 사용된다.
- Salt란 해시함수를 돌리기 전에 원문에 임의의 문자열을 덧붙이는 것을 말한다. 단어 뜻 그대로 원문에 임의의 문자열을 붙인다는 의미의 소금친다(salting)는 것이다.
- 이렇게 하면 설령 다이제스트를 알아낸다 하더라도 password를 알아내기 더욱 어려워진다. 그리고 사용자마다 다른 Salt 를 사용한다면 설령 같은 비밀번호라도 다이제스트의 값을 다르게 만들 수 있다. 즉, 노출되더라도 비교적 안전하게된다.