인증과 인가는 API에서 가장 자주 구현되는 기능중 하나이며 대부분의 API는 인증과 인가를 요구한다고 보면 된다.
인증(Authentication)은 쉽게 말해 유저의 아이디와 비밀번호를 확인하는 절차이다.
인가(Authorization)는
유저아이디와 비밀번호 생성
유저 비밀번호 암호화 후 DB저장
유저로그인 -> 아이디와 비밀번호 입력됨
유저가 입력한 비밀번호 암호화 후 DB에 지정된 유저 비밀번호와 비교
일치 시 로그인 성공
로그인 성공 시 access token 클라이언트에게 전송
유저가 로그인 성공 시 다음부터는 access token을 첨부하여 request를 서버에 전송함으로서 매번 로그인을 해도 되지 않도록 한다.
유저의 비밀번호는 절대 비밀번호 그대로 DB에 저장하지 않는데 DB가 해킹당하면 유저의 비밀번호가 그대로 노출 되거나 내부 인원이 비밀번호를 볼 수 있는 위험 때문이다. 따라서 유저의 비밀번호는 꼭 암호화하여 저장해야한다.
비밀번호 암호화에는 단방향 해쉬함수(one-way hash function)이 일반적으로 사용되는데 단방향 해시 함수는 원본메시지를 변환하여 암호화된 메시지인 digest를 생성한다.
원본 메시지를알면 암호화된 메시지를 구하기는 쉽지만 암호화된 메시지로는 원본 메시지를 구하기 힘들어 단 방향성이라고 칭한다.
단방향 해쉬함수는 기본적으로 짧은시간에 다양한 데이터를 검색하기 위해 설계되어 있기에 이러한 빠른 속성 때문에 공격자(해커)는 매우 빠른 속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트를 비교하는 것이 가능하다.
이러한 점을 보완하기 위하여 salting 과 Key Stretching이라는 것이 존재한다.
설팅(salting): 실제 비밀번호 이외에 추가적으로 랜덤데이터를 더해서 해시값을 계산하는 방법이다.
키스트레칭(Key Stretching): 단방향 해쉬값을 계산한 후 그 해쉬값을 또 hash과정을 진행하고 이를 계속 반복하는 것을 말한다.
bcrypt: 처음부터 비밀번호를 단방향 암호화 하기 위해 만들어진 해쉬 함수이다.
Authorization(인가) 는 유저가 요청하는 Request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차이다.
이 것또한 JWT를 통해 구현할 수 있다.
access token 을 통해 해당유저정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한도 확인할 수 있다.
JWT(Jason Web Token): access_token을 생성하는 여러가지 방법 중 하나로서 가장 널리 사용되는 기술이다.
말 그대로 유저정보를 담은 JSON 데이터를 암호화 해서 클라이언트와 서버간에 주고 받는 것이다.
로그인 api에서는 로그인이 성공하면 jwt로 만든 access token 을 받고 있다.
프론트엔드에서는 이 access token을 잘 가지고 있다가, 사용자 정보가 필요한 api를 호출할 때 access token을 백엔드로 넘겨준다.
Local Storage: 해당도메인에 영구 저장을 하고 싶을 때 사용
Session Storage: 해당 도메인의 한 세션에서만 저장하고 싶을 때, 창을 닫으면 데이터가 사라진다.
Cookie: 해당도메인에 날짜를 설정하고 그 때까지만 저장하고 싶을 때
로그인 뒤 accesstoken을 저장하기 위해서는
해당 API를 fetch하여 request의 header에(보통 여기에 accesstoken을 넣기 때문이다.)