​ ​
인증과 인가
Computer Science

인증과 인가

인증과 인가란

웹 서비스를 만들면서 서버와 데이터를 주고받는 기본적인 기능들을 구현하게 되는데, 이때 인증과 인가에 대한 개념을 모르고 넘어간다면 서버와의 통신이 막연하고 어렵게 느껴질 수 있다. 그래서 인증과 인가라는 개념을 먼저 정리해보려고 한다.

 

사전적 의미를 찾아보니

인증(Authentication)이란 어떠한 문서나 행위가 정당한 절차로 이루어졌다는 것을 공적기관이 증명한다는 뜻이고, 인가(Authorization)란 대상의 옳음을 밝혀 인정한다는 뜻이다.

 

이 두가지의 개념은 출입증에 비교하면 쉽게 이해할 수 있다.

방문자가 회사 건물에 방문했다고 가정했을 때,

1) 인증은 방문자가 자신이 회사 건물에 들어갈 수 있는지 확인을 받는 과정이다.

2) 인가는 방문자가 회사 건물에 방문했을 때, 어떤 공간에 접근이 가능한지 확인하는 과정이다. 관리자라면 건물 내의 다양한 공간에 접근할 수 있는 권한이 있지만, 방문자라면 허가된 공간에만 접근이 가능할 것이다.

이렇게 회사의 출입으로 예를 들었는데, 이를 웹 서비스에 적용해보자. 웹 서비스의 인증과 인가도 위의 예시와 비슷하게 생각하면 된다.

  1. 인증은 사용자가 누구인지 확인하는 절차다. 서비스에 등록된 유저의 신원을 입증하는 과정으로, 회원가입과 로그인 과정이 대표적인 예시다.
  2. 인가는 사용자에 대한 자원 접근 권한을 확인하는 과정으로, 특정 요청을 실행할 수 있는지 권한 여부를 확인하는 절차다.

 

인증과 인가의 필요성

Private Api는 물론 Public Api도 기본적인 인증과 인가가 요구된다.

인증(Authentication)은 서비스를 누가 사용했는지 추적이 가능하므로, 제3의 타인에 대한 서비스 정보 노출을 막을 수 있다.

인가(Authorozation)는 인증된 사용자에 대한 권한을 확인함으로써 A가 쓴 글을 B가 수정, 삭제 등을 할 수 없도록 막을 수 있다.

 

인증 방법

인증 방법은 4가지로 나눠서 볼 수 있다.

1. HTTP 헤더 요청 방식

인증을 받을 사용자 계정 정보를 http 요청에 담아 보내는 방식이다. 데이터를 요청할 때마다 사용자 정보를 계속해서 보내는 것이므로,  가장 보안이 낮은 인증 방식이다. 해커가 중간에 http 요청을 가로챈다면 사용자의 계정정보를 알아낼 수 있기 때문에 실제 서비스에서 거의 사용되지 않는 방식이다.

서버는 무상 태성이라는 속성을 가지고 있기 때문에 한번 요청을 받고 응답이 끝나면 상태 정보를 유지하지 않는다. 그래서 모든 페이지에서 계속해서 인증을 받아야 하고 이는 비효율적이다.

2. Session/ Cookie 방식

사용자의 계정 정보를 매번 모든 요청에 넣어서 보내는 것은 보안에도 취약하고 비효율적이다. 이를 보완하기 위해 나온 인증 방법이 session/cookie 방식이다.  순서는 아래의 그림으로 알 수 있다.

  1. 사용자가 로그인을 하면 서버에서 계정 정보를 확인한 후, 사용자에 고유한 id 값을 부여하여 세션 저장소에 저장한다.
  2. 세션 저장소에 저장한 id 값에 연결되는 세션 id를 발행한다. 사용자는 서버에서 session id를 전달받아 쿠키에 저장한다.
  3. 이후 인증이 필요한 요청마다 쿠키를 http 헤더에 실어서 보낸다.
  4. 서버에서는 쿠키를 받아 session id를 세션 저장소에서 대조를 하여 검증한 후에 대응되는 유저 정보를 가져온다.
  5. 인증이 완료되고 서버는 사용자에 맞는 데이터를 보내준다.

이러한 session/cookie 방식은 세션 저장소를 필요로 하는데, 사용자가 로그인했을 때 사용자의 정보를 저장하고 열쇠가 되는 session id값을 만든다. 세션은 서버에서 관리를 하는데, 웹 브라우저가 서버에 접속하여 종료할 때까지 인증 상태를 유지한다.

사용자 정보를 서버에 저장하므로 보안이 비교적 안전하지만, 사용자가 많아질수록 서버의 메모리를 많이 차지하게 되고, 이는 결국에 서버에 과부하를 주어 성능 저하를 야기한다.

3. 토큰 인증 방식

session이 서버의 메모리를 차지하는 단점 때문에 이를 해결하기 위해 토큰 기반의 인증방식을 사용하게 되었다. token 방식을 사용하면 서버가 정보를 저장하지 않게 되어 사용자가 많아져도 서버의 과부하나 성능 저하가 생기지 않는다.

토큰 인증 방식의 순서는 다음과 같다.

  1. 사용자가 로그인을 하면 서버에서 사용자를 확인하고, 사용자의 고유한 ID값을 부여한 후, 기타 정보와 함께 payload에 담는다.
  2. secret key를 이용하여 access token을 발급한다.
  3. 인증된 사용자는 응답에서 액세스 토큰(Access Token)을 받아 저장한다.
  4. 이 access token은 이후 http 요청마다 헤더에 담아서 전달하므로 서버는 요청한 사용자를 식별할 수 있다.
  5. 서버에서는 해당 토큰의 Verify Signature을 Secret key로 복호화하고, 검증이 완료되면 payload 디코딩하여 사용자의 id에 맞는 데이터를 가져온다.

토큰은 그 자체로 유저 정보를 가지고 있으므로, 인증 정보를 서버가 저장하지 않아도 되어 애플리케이션을 확장할 수 있다. 이는 무상 태성인 서버를 만드는데 큰 강점이다. 또한 한번 발급된 토큰은 탈취가 되어도 유효기간이 만료할 때까지 계속 사용이 가능하다. 따라서 토큰이 탈취되어 악의적으로 이용된다면 토큰의 유효기간이 만료할때까지 기다리 것 말고는 할 수 있는 것이 없기 때문에 보안에 유의해야 한다.

 

4. OAuth 인증

OAuth 인증은 사용자의 인증 정보를 다른 웹서비스에 전송할 수 있는 방식으로 이 기술을 사용하여 google, kakao 등의 로그인 서비스 등을 이용할 수 있다. 

 

위의 4가지의 인증방식은 하나씩 더 자세히 정리하려고 한다.

'Computer Science' 카테고리의 다른 글

CORS (Cross-Origin Resource Sharing)  (0) 2021.08.18
SPA (Single Page Application)  (0) 2021.06.23
JWT(Json Web Token)  (0) 2021.06.21
쿠키와 스토리지 (cookie & storage)  (0) 2021.06.20
TCP/ IP  (0) 2021.06.11