인증(Authentication) & 인가(Authorization)

eunji hwang·2020년 2월 19일
1
post-custom-banner

인증 & 인가?

인증과 인가는 API에서 자주 구현되는 기능중 하나이다.

인증 (Authentication)

유저 아이디와 비밀번호를 확인하는 절차를 가르키며, 로그인 하는 과정을 생각하면 된다.
인증을 위해서는 아이디/비번을 생성할수 있는 회원가입 기능 또한 필요하다.

인증, 로그인 절차는 어떻게 될까?

로그인의 과정을 살펴보자.

1. 회원가입을 통한 아이디/비밀번호 생성
2. 비밀번호 암호화 > DB저장
3. 유저 로그인 : 아이디와 비밀번호 입력
4. 비밀번호 확인 : 비밀번호를 암호화 한뒤 DB의 암호와 같은지 확인, 일치하면 로그인!
5. 로그인 성공 > access token을 클라이언트에게 전달
6. 발급받은 access token을 통해 로그인 유지 및 서비스 사용

로그인을 하기 위해 우리는 먼저 아이디/비밀번호를 DB에 저장해야 한다. 회원가입을 통해 진행하며, DB에 저장된 정보와 로그인 시 입력하는 값이 같을 경우 인증 절차가 마무리 된다. 이 과정에서 우리가 꼭 알아야 하는 것이 있다. 바로 DB에 저장되는 비밀번호는 암호화를 거친 상태라는 것과 로그인 인증을 받으면 access token을 통해 서비스를 이용하게 된다는 것이다.

비밀번호 암호화

국내의 경우 유저의 비밀번호는 필히 암호화를 거처 DB에 저장되도록 법으로 정해져 있다. 이 때문은 아니더라도 비밀번호는 개인의 정보와 밀접한 관련이 있기 때문에 노출되지 않도록 엄격한 주의가 필요하다. (대부분의 유저가 아이디와 비밀번호를 같게 쓰는 경우가 많아 한곳에서 노출되면 여러 곳에서 노출되는 것과 같다) 이 밖에 비밀번호 암호화가 필요한 이유에 대해 정리해보면 다음과 같다.

비밀번호 암호화 이유!

  • DB가 해킹당하면 유저의 비밀번호가 그대로 노출
  • 외부 해킹이 아니더라도 내부인력에게 노출 될 수 있음, 암호화를 통해 내부인력에게도 숨김

비밀번호 암호화 방법

  1. 단방향 해쉬함수(one-way hash function) : 한번 암호화 된 정보는 되돌릴 수 없다.
    • 그럼 어떻게 암호화 된 비밀번호를 맞는 지 확인할까?
      • 암호화 된 비밀번호를 저장, 로그인시 입력받은 비밀번호를 암호화 하여 동일한지 확인하여 로그인
    • 단방향 해쉬함수의 용도는 본래 비밀번호 암호화가 아니기 때문(본래는 짧은 시간에 데이터를 검색하기 위해 설계) 보안의 취약점이 있다.
    • 단점 : 입력값에 대한 결과값이 정해져 있기 때문에 역추적(Rainbow table attack)이 가능하다.
  2. Bcrypt : 비밀번호를 위해 만들어진, 단방향 해쉬함수의 취약점을 보안한 암호화 방법
    • Salting : 실제 비밀번호 이외 소금치듯 랜덤데이터를 추가하여 해시값을 계산한다.
      • 위 방법은 암호의 길이를 길게해 역추적의 경우의 수를 늘려 해쉬테이블을 만들지 못하도록 함
    • Key Stretching : 단방향 해쉬함수를 여러번 반복해서 해시값을 계산하는 방법
      • key stretching는 암호화 하는 속도를 늦춤. 로그인시 지연이 살짝쿵 발생
      • 컴퓨터의 성능이 향상되는 만큼 암호화 반복횟수를 늘려 암호화 보완이 가능

JWT(JSON Web Tokens)

JSON구문으로 작성된 웹 토큰, 로그인에 성공하게 되면 access token 발급받게 된다. access token에는 몇종류가 있지만 가장 많이 사용하는 기술중 하나가 JWT이다. JWT에는 유저정보를 담은 JSON데이터를 암호화 하여 클라이언트와 서버간에 주고 받게 된다.

JWT발급과 사용

1. 사용자 회원가입
2. 인증서버에서 JWT생성
3. 사용자에게 JWT전달
4. 사용자는 JWT를 통해 서비스 이용

인가 (Authorization)

사용자가 요청(Request)을 실행할 수 있는 권한이 갖는지 확인하는 절차.
JWT를 통해 구현될수 있다? YES! access token으로 사용자정보를 얻을 수 있음으로 권한확인 가능
유저는 요청을 보낼때 encoding 된 access token을 함께 첨부하며, 서버는 access token을 decoding을 통해 데이터를 확인, 유저 정보를 얻는다. 서버에서 해당 유저 정보를 통해 권한(permission)을 확인하여 해당 요청을 처리한다.

? access token

3가지 정보를 DOT(.)으로 구분하여 갖는다. 앞 2가지 정보는 encoding 되어 있으며 마지막 시그니처는 암호화 되어 있으며 유저정보와는 상관없는 정보를 담는다(서버에서 확인하는 시크릿 키)

profile
TIL 기록 블로그 :: 문제가 있는 글엔 댓글 부탁드려요!
post-custom-banner

0개의 댓글