인증
과 인가
는 API에서 가장 자주 구현되는 기능 중에 하나이다.
private한 API 뿐만 아니라 Public한 API도 기본적인 인증과 인가를 요구한다.
유저가 로그인을 시도하려면 회원가입이 선행되어야 한다. 회원가입을 하게 되면 유저의 비밀번호는 암호화 되어 DB에 저장된다.
access token
을 클라이언트에게 전송한다. 다음 요청(request)
부터는access token
을 request
에 첨부해서 서버에 전송함으로 매번 로그인할 필요가 없게 된다. access token
을 만드는 방법 중 가장 널리 사용되는 기술 중 하나이다. 백엔드에서 JWT를 생성할 때, 해당 유저가 누구인지 식별할 만한 정보를 담을 수 있다. 로그인 API에서 로그인이 성공하면 JWT로 만든 access token
을 받는다. 프론트앤드에서는 이 access token
을 갖고 있다가 사용자 정보가 필요한 API를 호출할 때 해당 access token
을 보내주어야 한다.
다이제스크(digest)
를 생산한다. 원본 메세지를 알면 암호화된 메세지를 구하기는 쉽지만 암호화된 메세지로는 원본 메세지를 구할 수 없어서 단방향성(one-way)
이라고 한다. 0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e
값이 나온다.d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb
값이 나온다. 1. 단방향 해쉬 함수의 취약점
Rainbow table attack
미리 해쉬값들을 계산해 놓은 테이블을 Rainbow table이라고 한다.
해시 함수는 원래 패스워드를 저장하기 위해서 설계된 것이 아니라 짧은 시간에 데이터를 검색하기 위해 설계된 것이다 (Remember Set?). 그렇기 때문에 해시 함수는 본래 처리 속도가 최대한 빠르도록 설계되었다. 이러한 속성 때문에 공격자는 매우 빠른 속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트를 비교할 수 있다(MD5를 사용한 경우 일반적인 장비를 이용하여 1초당 56억 개의 다이제스트를 대입할 수 있다).
이런 방식으로 패스워드를 추측하면 패스워드가 충분히 길거나 복잡하지 않은 경우에는 그리 긴 시간이 걸리지 않는다 (대부분 사용자의 패스워드는 길거나 복잡하지 않을 뿐 아니라, 동일한 패스워드를 사용하는 경우도 많다).
2. 보완하는 방법
Salting
과 Key Stretching
을 구현한 해쉬 함수중 가장 널리 사용되는 것이 bcrypt
이다. bcrypt
는 비밀번호를 잔향향 암호화 하기 위해 만들어진 해쉬함수이다.
request
를 실행 할 수 있는 권한이 있는 유저인지 확인하는 절차이다. acess token
을 통해 해당 유저 정보를 얻을 수 있어서 해당 유저가 가지고 있는 권한(permission)
도 확인 할 수 있다. access token을 생성
한다. access token
에는 유저 정보를 확인 할 수 있는 정보가 있어야 한다. (예를들어 user id)access token을 첨부
해서 보낸다. access token을 복호화
한다. 복호화된 데이터를 통해 user id를 확보한다.유저의 권한을 확인
한다. 권한을 가지고 있으면 해당 요청을 처리
한다. Unauthorized Response(401)
혹은 다른 에러 코드
를 보낸다.