📌 이 포스팅에서는 인증과 인가의 기초 개념에 대해 정리하였습니다.
🔥 인증(Authentication) 란?
🔥 인가(Authorization) 란?
✔️ 사이트의 서비스를 누가 사용하는지, 어떻게 사용하는지 등을 추적 가능하도록 하기 위해 인증 절차가 필요하다.
✔️ 즉, 사용자가 서비스 전반을 이용함에 있어서 현재 사용자를 식별하기 위한 목적으로 필수적이고, 회원가입과 로그인 과정에서 인증과 관련한 로직이 사용된다.
✔️ 이 과정에서 식별에 있어 가장 중요한 정보는 아이디 또는 이메일과 비밀번호이다.
✔️ 비밀번호는 절대 비밀번호 그대로 DB에 저장하면 안된다. Database가 해킹당하면 악용되고 외부 유출이 아니더라도 개발자나 내부 인력이 이를 확인할 수 없어야 하기 때문이다.
✔️ 특히, 개인정보를 Database에 저장할 때에는 해싱(hashing)하여 복호화할 수 없도록 해야한다. 또는 개인정보를 주고 받을 때 SSL을 적용하여 암호화하거나 보안이 향상된 HTTPS를 사용해야 한다.
✔️ 본래 해쉬 자료구조는 빠른 자료의 검색, 데이터의 위변조 체크를 위해 쓰이지만, 복원이 불가능한 단방향 해쉬함수는 암호적 용도로 사용한다. 대표적으로 SHA-256이 있다.
✔️ 해쉬 함수에 넣어 변환된 결과값은 원본의 값이 무엇인지 알기 어렵기 때문이다.
"test password"를 hash256해쉬 함수를 사용하면 ⇢
0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e 값이 나온다.
"test password2"를 hash256 해쉬 함수를 사용하면 ⇢
d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb 값
✔️ 다만, 미리 해쉬값들을 계산해 놓은 테이블을 Rainbow table이라고 하는데, 이 레인보우 테이블은 보안을 취약하게 만들기 때문에 Salting & KeyStretching 기술을 해싱 과정에서 추가로 적용시킨다.
✔️ Salting : salting은 음식에 조미료를 뿌르듯이 첨가한다는 의미이다. salting은 임의의 랜덤한 값을 합쳐서 해슁하는 기술입니다.
✔️ Key Stretching : KeyStretching은 단방향 해쉬값을 계산 한 후 그 해쉬값을 또 해싱 하고, 또 이를 반복하는 것을 말한다. 이는 해커가 패스워드 무작위 대입을 통해 해시값을 계산하는데 필요한 시간을 늘려 원본 값을 유추하기 어렵게 만드는 기능을 한다.
✔️ Salting과 KeyStretching을 하기 위해 대표적으로 bcrypt를 사용한다.
✔️ Authorization은 유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차 이다.
✔️ 예를 들어, 어떤 페이지의 조회나 작업은 어느 이상의 권한이 필요하던가, 또는 게시물에 대해 작성하지 않은 사람이 수정하거나 삭제하면 곤란하기 때문이다.
✔️ 인가를 주거나, 인가된 사용자인지 확인하기 위해서 Session 또는 JWT를 사용한다.
✔️ JWT의 구조는 header, payload, signature의 3단 구조되어있다.
✔️ header에는 토큰의 타입과 해시 알고리즘 정보가 들어간다. 이에 header의 내용은 BASE64 방식으로 인코딩해서 JWT의 가장 첫 부분의 기록된다.
✔️ JWT의 payload 부분에는 만료기간을 나타내는 exp와 사용자를 식별할 수 있는 내용이 들어간다.
다만, 이 내용으로 사용자의 정보와 관련된 데이터를 사용하면 안된다. 이에 노출되도 큰 문제가 없는primary key를 사용한다.
✔️ signature은 '원본 그대로라는 것'을 확인하기 위한 부분으로 프론트에서 JWT token을 밴엔드 API 서버로 전송할 때, 서버에서는 전송받은 signature를 복호화하여 서버에서 생성한 JWT가 맞는지 확인한다. 마치 계약서의 위변조를 막기 위해서 서로 원본임을 확인하는 과정과 같다.