인증 & 인가

Nina·2020년 10월 13일
0
post-thumbnail

1. 인증, 인가

(1) 인증(authentication)이란?

In computing, authentication is the process of verifying the identity of a person or device.

인증은 유저의 identification을 확인하는 절차로, 로그인 과정이 대표적이다. 인증을 위해서는 아이디와 비밀번호를 생성하는 절차가 선행되어야 한다. 이 때 사람이 입력하는 비밀번호는 보안에 취약하기 때문에, 암호화 과정이 필요하다.

🔒 회원가입 / 로그인 절차

🔑 유저 아이디 및 비밀번호 생성
🔑 암호화한 유저 비밀번호를 DB에 저장
🔑 유저 로그인(아이디 및 비밀번호 입력)
🔑 유저가 입력한 비밀번호 암호화한 후 DB에 저장된 비밀번호와 비교
🔑 일치하면 로그인 성공(access token 전송)
🔑 로그인 성공 후에는 access token을 첨부하여 request를 보냄(http의 stateless한 특징 때문)

(2) 인가란?

Authorization is a security mechanism used to determine user/client privileges or access levels related to system resources, including computer programs, files, services, data and application features.

인가는 특정 request를 전송하는 유저가 이를 요청할 권리가 있는 유저인지 확인하는 절차이다. 넷플릭스에 가입은 했지만 돈을 지불하지 않은 고객은 스트리밍 서비스를 이용할 권리가 없으므로 동영상 재생 요청을 보내도 실행이 불가하다. 이런 경우 인가가 필요하다.

🔒 인가 절차

🔑 유저를 특정할 수 있는 정보가 들어간 access token을 인증 과정을 통해 생성
🔑 유저가 request를 보낼 때 access token을 첨부
🔑 서버는 유저가 보낸 access token을 복호화
🔑 복호화된 데이터를 통해 유저를 특정
🔑 특정된 user id를 사용해서 DB에서 해당 유저의 권한 확인
🔑 유저가 권한이 있으면 해당 요청 처리
🔑 유저가 권한이 없다면 에러 코드 전송

2. 유저 비밀번호 암호화

만약 유저가 입력한 비밀번호가 그대로 DB에 저장된다면, DB에 접근 가능한 모든 사람들은 유저의 비밀번호를 볼 수 있을 것이다. 또한 해킹을 당할 경우 외부에 유저의 비밀번호가 모두 노출된다. 따라서 유저의 비밀번호는 항상 암호화해서 저장해야한다. 비밀번호 암호화에는 단방향 해쉬 함수가 쓰이는데, 유저가 입력한 비밀번호를 암호화 하는 것은 가능하지만 이를 해독하는 것은 불가하게 만들어 보안을 강화하기 위함이다.

🔐 Bcrypt

단방향 해쉬 함수에도 취약점이 있다. 패스워드가 충분히 길거나 복잡하지 않으면 미리 해쉬값들을 계산해 놓은 테이블(rainbow table)을 이용한 rainbow table attack을 통해 해킹이 가능하다. bcrypt를 이용하면 salting(실제 비밀번호에 랜덤 데이터를 더해 해쉬값을 계산)과 key stretching(단방향 해쉬값을 계산한 후 동 값을 반복해서 다시 해쉬)을 통해 이를 보안할 수 있다.

3. JWT(JSON Web Tokens)

유저가 로그인에 성공하면 access token이라는 암호화된 유저 정보를 첨부해서 request를 보내게 된다. 롯데월드의 모든 직원들이 내가 자유이용권을 샀다는 사실을 알 수는 없으므로, 놀이기구를 탈 때 자유이용권을 보여준 후 입장하는 것과 비슷하다. 그러면 매 번 놀이기구를 탈 때마다 표를 사지 않아도 된다.

access token을 생성하는 방법에는 여러가지가 있는데, 그 중 가장 널리 사용되는 기술 중 하나가 JWT(JSON Web Tokens)이다. JWT는 유저 정보를 JSON 데이터에 담아 암호화해서 유저와 서버 간에 주고받도록 한다.

profile
https://dev.to/ninahwang

0개의 댓글