해당 내용의 모든 출처는 부트캠프 위코드입니다.
https://wecode.co.kr/
인증 & 인가
- 인증과 인가는 API에서 가장 자주 구현되는 기능
- Private한 API는 물론, Public한 API도 기본적인 인증과 인가를 요구
1. 인증(Authentication)
- 인증은 유저의 identification을 확인하는 절차다.
- 유저의 아이디와 비번을 확인하는 절차.
로그인 절차
- 유저 아이디와 비번 생성.
- 유저 비번 암호화해서 DB에 저장.
- 유저 로그인(아이디와 비밀번호 입력)
- 유저가 입력한 비밀번호를 암호화하여 DB에 저장된 유저 비밀번호와 비교.
- 일치하면 로그인 성공
- 로그인 성공시, access token을 클라이언트에게 전송.
- 이후부터는 access token을 첨부해서 request를 서버에 전송함으로 매번 로그인하지 않아도 됨
2. 유저 비밀번호 암호화
- 유저의 비밀번호는 절대 비밀번호 그대로 DB에 저장되지 않는다.
-DB 해킹시, 비밀번호가 그대로 노출됨
-내부 개발자나 인력이 유저의 비밀번호를 봄
따라서 유저의 비밀번호는 꼭 암호화
- 비밀번호 암호에는 단방향 해쉬 함수(one-way hash function)가 일반적으로 쓰임
-단방향 해시 함수는 원본 메시지를 변환하여 암호화된 메시지(다이제스트)를 생성.
-암호화된 메시지를 구해도, 원본 메시지를 구할 수 없어 단방향성(one-way)이라고 함
3. Bcrypt
- 단방향 해쉬 함수도 취약점이 있다.
- Rainbow table attack - 미리 해쉬값들을 계산해 놓은 테이블.
-해시 함수는 원래 패스워드를 저장하기 위해서 설계된 것이 아니라 짧은 시간에 데이터를 검색하기 위해 설계 된것.
-이러한 속성 때문에 공격자는 매우 빠른 속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트를 비교
- 단방향 해쉬 함수의 취약점을 보완하기 위해 2가지 보완점들이 사용된다.
salting
- 실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시값을 계산하는 방법
Key Stretching
- 단방향 해시값을 계산한 후, 그 해쉬값을 또 해쉬고하고.. 이를 반복하는 것.
Salting과 Key Streching을 구현한 해쉬 함수 중 가장 널리 사용되는 것이 bcrypt이다.
4. JWT
- 로그인 성공 후, access token이라는 암호화된 정보를 첨부하여 request를 보냄.
- 서버에서는 access token 을 복호화해서 해당 유저 정보를 얻게 됨.
- 복호화해서 얻은 유저 아이디를 통해 해당 유저가 누군지 알게 됨.
- access token을 생성하는 방법은 여러가지가 있는데, 그 중 가장 많이 사용되는 것이 JWT
JWT(JSON Web Tokens)는 말 그대로 유저 정보를 담은 JSON 데이터를 암호화해서 클라이언트와 서버간에 주고 받는 것이다.
5. 인가(Authorization)
- 인가는 유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차
인가절차
- 인가 절차를 통해 access token을 생성. access token에는 유저 정보를 확인정보 있음(id 등)
- 유저가 request를 보낼 때 access token을 첨부해서 보냄
- 서버에서, 유저가 보낸 access token을 복호화
- 복호화된 데이터를 통해 user id를 얻음.
- user id를 사용하여 DB에서 해당 유저의 권한을 확인
- 유저가 권한을 가지고 있으면 요청을 처리
- 유저가 권한이 없으면 401 혹은 다른 에러 코드를 보낸다.
-
인증이란?
유저의 신원을 확인하는 절차
-
비밀번호 암호화는 어떻게 이루어지는가?
단방향 해시 함수, 원본 메시지를 변환하여 암호화된 메시지를 생성
-
단방향 해쉬함수 그리고 레인보우 테이블 어택
일반적인 단방향 해시함수의 취약점.
미리 해시값을 계산해 놓은 테이블(레인보우 테이블)에 의해 공격 당할 수 있음
-
솔팅과 키스트레칭 그리고 bcryt
단방향 해시함수의 취약점을 보완하기 위한 방법으로
솔팅은 기존 비번에 추가적으로 랜덤 데이터를 더하여 계산
키스트레칭은 단방향 해시값 계싼후 그 값을 해시하고 해시하고.. 반복함(길어짐)
-
인가란?
유저가 요청하는 응답을 실행할 수 있는 권한이 있는가 확인하는 절차
-
JWT는?
JSON Web Tokens, 유저 정보를 담은 JSON 데이터를 암호화하여 클라이언트와 서버간에 주고 받는 것.
이런 절차?
클라이언트 요청 - 인증 - 비밀번호 암호화(bcrypt) - JSON 데이터(access token 전달) - 비밀번호 복호화 - 인가 - 요청 응답