ivory's Log
그게 무엇이라도 항상 쉬운 일이다.

ivory's DevLog

인증(Authentication)과 인가(Authorization)

ivorycode 2020. 12. 22. 17:53
반응형

이 글은 인증(Authentication)과 인가(Authorization)에 대해 적은 글입니다. 이 포스팅을 포함해 게시된 모든 포스팅의 큰 주제는 순차적인 흐름을 지키지 않습니다. 혼란에 주의해 주세요!


이미지 출처: www.google.com

인증과 인가는 API에서 자주 구현되는 기능이다. 물론 Private API, Public API에서도 구분 없이 모두 기본적인 인증과 인가를 요구한다.

 

인증

Authentication

인증은 사용자가 누구인지 확인하는 절차다. 회원가입, 로그인 과정이 인증의 대표적인 예시다. 회원가입, 로그인 과정을 예시를 살펴보자.

회원가입 과정
1. 아이디, 비밀번호를 생성한다.

2. 비밀번호를 암호화하여 DB(데이터베이스)에 저장한다.

로그인 과정
1. 등록된 아이디와 비밀번호를 입력한다.

2. 암호화되어 DB에 저장된 사용자의 비밀번호가 서로 일치하는지 비교한다.

2-A. 일치하면 로그인한다.
2-B. 일치하지 않을 시, 로그인에 실패한다.

3. 로그인에 성공하면, Access Token을 클라이언트에 전송한다.

4. 최초 로그인 성공 후, 다음부터는 Access Token을 첨부하여 서버에 요청을 전송함으로써 매번 로그인하는 과정을 생략할 수 있다. 

 

정보를 첨부하여 통신을 보내는 방법

앞의 회원가입, 로그인 절차를 다시 확인해보면, 암호화 한 비밀번호를 DB에 저장한 후에 로그인 과정에서 Access Token에 해당 정보를 첨부한다고 언급되어있다. 여기서 어떤 방식으로 유효하고, 보안성까지 고려한 정보를 첨부해 통신을 보내는 것일까? 우선 정보를 첨부하는 방식은 여러 가지가 있었다.

 

1. ID, PW를 함께 보낸다.
- 가장 단순한 방법이지만, 매번 서버에서 확인을 해야 하는 번거로움이 있었다. 또한 사용자의 정보를 매번 조회해야 하기 때문에 보안면에서도 가장 취약한 방법이었다.

2. 일정 시간이 지나면 만료되는 임시 ID를 보낸다.
- 앞선 방법보다 보안 이슈가 적은 방법이다. 하지만 임시 ID를 사용하게 되면, 어떤 사용자가 요청했는지 파악하기가 힘들다. 이렇게 되면, 실제 유저 정보와 임시 정보를 서로 매핑을 해야 하므로 효율성이 매우 떨어진다.

🤔매핑(Mapping)??
하나의 값을 다른 값으로 대응하는 것을 말한다. 쉽게 정리해서 연관성을 관계하여 연결시켜주는 의미이며, 해당 값이 다른 값을 가리키도록 하는 것이다.

3. 일정 시간 동안 인가에 유효한 정보로 대체한다.
- 유저의 정보를 담은 JSON 데이터를 암호화하여, 클라이언트와 서버 간에 정보를 주고받는 JWT를 이용한다.

 

JWT(JSON Web Tokens)

설명하기 앞서, JWT에 관련한 포스팅을 따로 정리해두었으므로 JWT에 대한 개념 설명은 생략하고, 인증과 관련된 간단한 내용만 포스팅하겠다.

 

JWT 개념 설명
https://ivorycode.tistory.com/entry/JWTJson-Web-Token

 

유저가 로그인에 성공하면, Access Token을 첨부하여 서버에 요청을 전송한다고 했다. Access Token을 생성하는 방법은 여러 가지가 있는데, 그중 JWT는 가볍고, 토큰 자체를 정보로 사용하는 자가 수용적인(Self-Contained) 방식으로 정보를 안전하게 전달하므로 널리 사용되는 기술이다.

 

사용자 비밀번호 암호화

개인정보를 포함한 보안 관련 이슈는 언제나 그렇듯 민감하고 철저해야 한다. 인증에서도 예외는 아니며, 사용자 비밀번호를 저장할 때 고려하는 사항들이 몇 가지 있다.

1. 비밀번호를 반드시 암호화하여 저장한다.
- 비밀번호가 저장된 DB가 해킹당하면, 사용자의 정보가 모두 노출되므로 비밀번호는 반드시 저장하도록 한다.

- 외부 해킹뿐만이 아니라, 내부에서도 비밀번호를 악용할 수 있으므로 암호화 작업이 반드시 필요하다.

2. 단방향 해쉬 함수를 이용하여 비밀번호 암호화를 시도한다.
- 비밀번호를 암호화할 때, 일반적으로 단방향 해쉬 함수가 쓰이는데 그 이유는, 복호화가 불가능하므로 원본 비밀번호를 알아낼 수가 없기 때문이다.

- 단방향 해쉬 함수를 사용하는 다른 이유는 외부에서 정보가 해킹당했을때, 내부에서 정보가 유출될 때를 모두 대비하기 위함도 있다.

 

인가

Authorization

인가는 사용자가 요청하는 요청(Request)을 실행할 수 있는 권한 여부를 확인하는 절차다. '블로그 포스팅 글쓴이'와 '포스팅을 읽는 사용자'들을 예시로 하여 쉽게 접근해보자. 사용자들은 여러 블로그 포스팅을 참조할 수 있지만, 해당 내용을 수정할 수 있는 권한은 글을 직접 게시한 글쓴이만 가능하다. 이것이 바로 인가의 모든 것(?)이다.

 

인가의 절차

인가 절차에서도 JWT 기술을 적용하여 구현할 수 있다. Access Token에서 사용자의 정보를 얻을 수 있으며, 해당 사용자의 권한 여부도 확인이 가능하다.

1. 인증(인가가 아닌 인증이다!!) 절차를 통해, Access Token을 생성한다. 이 토큰은 사용자의 정보를 담은 상태이다. (ex. 사용자 아이디 값)

2. 사용자가 요청을 보낼때, Access Token을 첨부하여 보낸다.

3. 서버는 해당 Access Token을 복호화하고, 정보를 얻는다. (Access Token에 담긴 정보)

4. 얻은 정보를 사용하여, DB에서 사용자 권한을 확인한다.

5-A. 사용자의 권한이 확인되면, 해당 요청을 처리하도록 한다.
5-B. 권한이 없다면, 에러코드를 출력한다. 일반적으로 Unauthorized Response(401) 에러코드를 출력한다.

 

정리

다른 예시를 적용하여 간단하게 정리해봤다.

 

인증이란?

사용자가 누구인지 확인하는 절차.

- 건물 출입이 가능한 사람인지 확인

삼성전자 직원입니까? → 정직원 바로 출입 가능
방문자인가요? → 정직원이 아님. 출입증을 통해 인증받아야 함.

 

인가란?

사용자가 요청하는 요청을 실행할 수 있는 권한 여부를 확인하는 절차.

- 출입할 수 있는 건물 공간이 어디까지 인가?

건물 관리자입니까? 모든 공간에 출입 가능
방문자인가요? → 허용된 공간만 입장 가능함. 일부 공간 접근 불가 (ex. 관계자 외 출입 불가 지역)
반응형

'ivory's DevLog' 카테고리의 다른 글

HTTP와 HTTPS 그리고 Mixed Content  (0) 2021.03.26
Next.js를 사용하는 이유  (2) 2021.03.03
JWT(JSON Web Token)  (0) 2020.12.19
[React] - React Router  (0) 2020.11.22
Git 폭파범이 정리한 Git에 관한 기본 개념  (0) 2020.11.04