사용자 인증과 허가에 대한 이야기 - 1. 인증과 허가란 ?
인증과 허가란 대체 무엇인가...✨
인증(Authentication)과 허가(Authorization)는 웹 어플리케이션(우리가 흔히 이용하는 웹 서비스)에서 사용자별로 서비스를 제공하고 관리하기 위해 필수적인 영역입니다. 일단, 각 용어에 대한 설명을 간단히 적어보겠습니다.
용어 정리 💡
- 인증(Authentication) : 사용자를 확인하는 과정입니다. 요청(request)으로 보내온 클라이언트 정보가 DB 서버에 등록되어 있는지를 확인하여 서버가 접속한 주체를 파악합니다.
- 허가(Authorization) : 사용자가 해당 페이지에 접속할 권한을 가지고 있는지 확인합니다. 예를 들어 관리자, 일반 사용자, 일회성 게스트 등 유저의 등급에 따라 접속 권한을 부여했을 때 이 권한을 확인하는 작업을 말합니다.
- 자격증명(Credentials) : 자격증명은 제 3자로(보통 인증기관)부터 개인에게 발행된 자격 허가 증명서입니다.
인증 시스템은 왜 필요한가 ? 🧐
우리가 이용하는 대부분의 웹 어플리케이션은 HTTP를 통해 통신합니다.
그런데 HTTP는 무상태성(Stateless) 프로토콜이기 때문에, 상태(State)를 유지하고 기억하지 않습니다.
그렇기 때문에 어떤 클라이언트가 보내온 요청인지 서버는 구분하지 못하고, 과거의 정보에 기반하여 클라이언트를 판단할 수도 없습니다.
따라서 서버는 쿠키(Cookie)를 이용해 사용자를 구분하고 확인하는 작업(➡️ 인증)을 하게되었고, 클라이언트로부터 본인만 알 수 있는 등록된 정보를 받아 확인하는 작업을 통해 사용자를 구분하게 되었습니다. 이러한 원리를 기반으로 보안 및 서비스의 특징에 따라 다양한 인증시스템이 만들어지게 되었습니다.
인증 방식의 종류
HTTP/1.1 기준으로, 인증방식은 대표적으로 다음과 같이 4가지가 있습니다.
- BASIC 인증
- DIGEST 인증
- SSL 클라이언트 인증
- 폼 베이스 인증
BASIC/DIGEST
- HTTP가 표준으로 제공하는 인증 기법입니다.
- BASIC, DIGEST는 보안적인 이슈가 많기 때문에 실제로 잘 쓰이지 않는 인증 기법입니다.
SSL 클라이언트 인증
- SSL 클라이언트 인증은 HTTPS 클라이언트 인증서를 이용하여 인증을 하는 방식입니다.
- 사전에 클라이언트 증명서를 발급하면, 클라이언트를 이를 저장해놓고 서버에 접속할 때마다 해당 증명서로 인증을 하여 검증 결과가 정확한다면 공개키를 발급하여 HTTPS 내부의 암호화된 정보를 습득할 수 있게 됩니다.
- SSL 클라이언트 인증의 경우 단독으로 사용되는 경우는 거의 없고 2-factor 인증을 통해 사용됩니다.
- 1차 인증 : SSL 클라이언트 인증을 통한 클라이언트 컴퓨터 인증
- 2차 인증 : 패스워드를 통한 유저 본인에 대한 확인
- 하지만, SSL은 증명서를 구입하는 비용이 한 클라이언트 당 수만 원에서 수백만 원 정도 하기 때문에 비용적인 문제로 흔하게 사용되는 방식은 아닙니다.
폼 베이스 인증
- HTTP 프로토콜에서 특별히 사양이나 양식이 정해진 인증 방식이 아닙니다.
- 클라이언트가 서버 상의 웹 어플리케이션에 자격 정보(Credential)를 송신하면 그 자격 검증 결과에 따라 인증을 하는 방식입니다.
- 공통 사양이 정해지지 않아 웹 사이트 별로 다르게 구현하여 사용하게 되었고 세션관리와 쿠키를 통한 다양한 인증 시스템이 생기게 되었습니다.
- 서버 기반(Session) 인증, 토큰(Token) 기반 인증(OAuth, JWT)등이 있습니다.
해당 내용은 개인적으로 공부한 내용을 담은 것이기 때문에 잘못된 내용은 댓글로 부탁드립니다. 🙇🏻♀️
Reference