TIL -인증&인가

sanghun Lee·2020년 8월 11일
0

Today I Learned

목록 보기
41/66

1. 인증이란?

인증과 인가는 API에서 가장 자주 구현되는 기능중 하나이며 대부분의 API는 인증과 인가를 요구한다고 보면 된다.

인증(Authentication)은 쉽게 말해 유저의 아이디와 비밀번호를 확인하는 절차이다.

인가(Authorization)는

1.1 로그인 절차

유저아이디와 비밀번호 생성
유저 비밀번호 암호화 후 DB저장
유저로그인 -> 아이디와 비밀번호 입력됨
유저가 입력한 비밀번호 암호화 후 DB에 지정된 유저 비밀번호와 비교
일치 시 로그인 성공
로그인 성공 시 access token 클라이언트에게 전송
유저가 로그인 성공 시 다음부터는 access token을 첨부하여 request를 서버에 전송함으로서 매번 로그인을 해도 되지 않도록 한다.

2. 비밀번호 암호화는 어떻게 이루어지는가?

유저의 비밀번호는 절대 비밀번호 그대로 DB에 저장하지 않는데 DB가 해킹당하면 유저의 비밀번호가 그대로 노출 되거나 내부 인원이 비밀번호를 볼 수 있는 위험 때문이다. 따라서 유저의 비밀번호는 꼭 암호화하여 저장해야한다.

비밀번호 암호화에는 단방향 해쉬함수(one-way hash function)이 일반적으로 사용되는데 단방향 해시 함수는 원본메시지를 변환하여 암호화된 메시지인 digest를 생성한다.
원본 메시지를알면 암호화된 메시지를 구하기는 쉽지만 암호화된 메시지로는 원본 메시지를 구하기 힘들어 단 방향성이라고 칭한다.

3. 단방향 해쉬함수 그리고 레인보우 테이블 어택

  • Rainbow table 미리 hash 값들을 계산해놓은 테이블을 Rainbow table이라고 한다.

단방향 해쉬함수는 기본적으로 짧은시간에 다양한 데이터를 검색하기 위해 설계되어 있기에 이러한 빠른 속성 때문에 공격자(해커)는 매우 빠른 속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트를 비교하는 것이 가능하다.

이러한 점을 보완하기 위하여 salting 과 Key Stretching이라는 것이 존재한다.

4. 설팅(salting)과 키스트레칭(Key Stretching) 그리고 bcrypt

설팅(salting): 실제 비밀번호 이외에 추가적으로 랜덤데이터를 더해서 해시값을 계산하는 방법이다.

키스트레칭(Key Stretching): 단방향 해쉬값을 계산한 후 그 해쉬값을 또 hash과정을 진행하고 이를 계속 반복하는 것을 말한다.

bcrypt: 처음부터 비밀번호를 단방향 암호화 하기 위해 만들어진 해쉬 함수이다.

5. 인가란?

Authorization(인가) 는 유저가 요청하는 Request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차이다.
이 것또한 JWT를 통해 구현할 수 있다.
access token 을 통해 해당유저정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한도 확인할 수 있다.

5.1 인가절차(Authorization procedure)

  1. Authentication 절차를 통해 acesstoken을 생성한다(유저정보를 확인할 수 있는 정보가 들어가 있어야 한다 ex) user ID)
  2. 유저가 request를 보낼 때 access token을 첨부해서 보낸다.
  3. 서버에서는 유저가 보낸 access token을 복호화 한다.
  4. 복호화된 데이터를 통해 user id를 얻는다.
  5. user id를 사용하여 databbase에서 해당 유저의 권한을 확인한다.
  6. 유저가 권한 소지 시 해당요청 처리
  7. 유저가 권한이 없다면 에러코드 보낸다(Unauthorized Response(401) etc..)

6. JWT에 대해 배워봅시다.

JWT(Jason Web Token): access_token을 생성하는 여러가지 방법 중 하나로서 가장 널리 사용되는 기술이다.
말 그대로 유저정보를 담은 JSON 데이터를 암호화 해서 클라이언트와 서버간에 주고 받는 것이다.

7. JWT 로 로그인 구현

로그인 api에서는 로그인이 성공하면 jwt로 만든 access token 을 받고 있다.
프론트엔드에서는 이 access token을 잘 가지고 있다가, 사용자 정보가 필요한 api를 호출할 때 access token을 백엔드로 넘겨준다.

7.1 저장

Local Storage: 해당도메인에 영구 저장을 하고 싶을 때 사용
Session Storage: 해당 도메인의 한 세션에서만 저장하고 싶을 때, 창을 닫으면 데이터가 사라진다.

Cookie: 해당도메인에 날짜를 설정하고 그 때까지만 저장하고 싶을 때

로그인 뒤 accesstoken을 저장하기 위해서는
해당 API를 fetch하여 request의 header에(보통 여기에 accesstoken을 넣기 때문이다.)

profile
알고리즘 풀이를 담은 블로그입니다.

0개의 댓글