Rizingblare 2024. 4. 18. 13:25

1. 개요

먼저, 인증과 인가의 사전적 정의에 대해서 살펴보자.

 

인증 (Authentication) : 어떠한 문서나 행위가 정당한 절차로 이루어졌다는 것을 공적 기관이 증명함.
인가 (Authorization) : 인정하여 허가함.

 

다음과 같으며 개발에서 인증내가 누구인지 확인하는 행위, 인가내가 권한이 있는지 확인하는 행위라고 할 수 있다.

 

사실 말장난에 가깝다보니 헷갈리면 인가 대신 승인이라고 생각해도 좋다. 요즘 승인이라는 용어도 많이 사용한다고 함.

 

2. 인증과 인가

네이버 카페를 예시로 구체적인 상황으로 살펴보자

 

게시물을 읽으려고 포스팅 목록을 눌렀을때 '로그인이 필요합니다' 경고창과 함께 로그인 인증이 요구된다면 서버 입장에서는 현재 요청자가 카페 회원인지 누군지 몰라서 일어나는 상황. 즉, 인증(Autentication) 되지 않은 상황이다.

 

 

 

회원가입 및 로그인을 하고 게시물에 들어갈 수 있게 되었지만, 이번엔 어느 특정 게시판에 있는 게시글을 읽으려고 하니 '스탭 등급 부터 읽을 수 있습니다' 라는 경고창이 뜬다면,  서버 입장에서는 현재 요청자가 회원가입을 했으니 누군지는 알지만, 회원 등급에 따라 사용자는 요청한 자원에 접근한 권한이 없다고 판단하여 차단한 상황, 승인(Authorization) 되지 않은 상황이다.

 

즉, 인증되었다고 하더라도, 승인되지 않았다면 특정 리소스에 접근할 수 없다는 원리이다.

 

그렇다면 인증과 승인은 어떤 과정을 거쳐 이루어지는지 살펴보자.

이를 이해하기 위해선 HTTP 통신의 무상태성(Stateless)에 대해서 먼저 짚고 넘어갈 필요가 있다.

 

3. 무상태성 (Stateless)

먼저 HTTP는 인터넷에서 데이터를 주고받을 수 있는 프로토콜, 즉 통신 규약이다.

 

HTTP 통신에는 몇 가지 특징이 있는데 그 중에서 무상태성은 HTTP 통신에서

서버는 현재요청과 이전요청의 맥락을 기억하지 못한다는 것이다.

 

이와 같은 무상태성으로 인해 확장성에 많은 이점을 갖는데, 이 부분은 HTTP 통신의 파트에서 자세히 다루어보도록 하자.

 

이번 포스팅에서는 인증과 인가에 대한 부분을 중점적으로 다루기 때문에

이처럼 무상태성이 특징인 HTTP 통신에서 인증과 인가를 구현하기 위한 방법으로는 어떤 것들이 있을까?

 

 

4. HTTP 환경에서의 인증과 인가

HTTP 환경에서 다음과 같은 방식으로 인증과 인가를 구현할 수 있다.

URL을 통한 식별 방식, IP 주소 식별 방식, HTTP 기본 인증 방식, 쿠키와 세션을 통한 인증 방식,

그리고 가장 많이 사용되는 토큰(JWT) 기반 인증 방식이다.

 

각각의 장단점에 대해서 알아보자.

 

1) 뚱뚱한 URL을 통한 식별 방식

장점은 잘 모르겠고 URL에 개인정보가 전부 담긴다는 점. 각 URL에 해당하는 HTML 페이지를 생성해야하므로 서버 부하가 가중된다는 점. 로그아웃 시 기존의 데이터가 삭제된다는 점. 등등 그냥 말도 안되는 방식이라고 생각함.

 

 

2) IP 주소 식별 방식

IP 주소를 통해 사용자를 식별하는 방식이 있는데 이는 사람을 식별하는 것이 아닌 컴퓨터를 식별하는 것이므로,

해당 컴퓨터를 다른 사용자가 조작할 때 아무런 대처도 할 수 있는 문제점을 갖는다.

또한, ISP가 동적으로 IP주소를 할당하기 때문에 IP 주소가 바뀔 수도 있고, 방화벽/프록시/게이트웨이 등의 이유로 클라이언트의 IP 주소를 알기 어렵다는 문제점도 있다.

 

3) HTTP 기본 인증 방식

HTTP 요청을 보낼 때는 사용자에 대한 정보를 전달하는 헤더가 존재한다.

From: 사용자의 이메일 주소
User-Agent: 사용자의 브라우저
Referer: 사용자가 현재 링크를 클릭한 원본 페이지
Authorization: 사용자의 이름과 비밀번호

 

헤더에는 위와 같은 정보들을 담는데 그중에서 Authorization을 사용해 인증/인가를 구현할 수 있다.

하지만 이는 base64 인코딩을 통해 정보가 전달되기 때문에 제 3자가 쉽게 디코딩할 수 있는 문제점이 있다.

재전송 공격, 가짜 서버 위장 등에도 취약하다고 한다.

 

4) 쿠키와 세션을 통한 인증 방식

쿠키는 브라우저에 키와 값의 형식으로 저장되어 클라이언트의 상태 정보를 저장하는 데이터 파일을 말한다.

이는 사용자가 따로 요청하지 않아도 헤더에 담겨 서버로 전송된다.

반면, 세션은 쿠키와 달리 서버측에서 관리하며 클라이언트를 식별하기 위해 세션 ID를 부여하는 방법을 의미한다.

 

하지만 이는 오늘날과 같은 다중 서버 환경에서 서버 간의 세션 불일치 문제가 발생한다는 단점이 있다.

이를 해결하기 위한 별도의 방법들도 존재하지만 확장성이 떨어진다는 문제는 해결하지 못하고 있다.

 

5) 토큰 기반 인증 방식

대망의 토큰 기반의 인증 방식이다. 주로 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token인 JWT를 이용한다. 이 방식은 무상태성을 보장할 수 있고 DB를 조회하지 않고 인증된 회원인지 식별할 수 있다는 등의 장점이 있다. 가장 널리 많이 사용되는 방식이지만 정보를 담는 Payload는 실질적으로 암호화되지 않기 때문에 중요한 정보는 담을 수 없고, 앞선 방식들과 다르게 토큰 자체의 데이터 길이가 길고, 토큰 자체를 탈취 당하면 대처하기가 어렵다는 등의 문제점은 여전히 존재한다

 

# 참고자료

https://inpa.tistory.com/entry/CS-%F0%9F%91%A8%E2%80%8D%F0%9F%92%BB-Authentication-vs-Authorization-%EC%B0%A8%EC%9D%B4-%EC%97%84%EC%B2%AD-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85

 

👨‍💻 쉽게 이해하는 Authentication vs Authorization 차이

Authentication / Authorization 차이점 보통 우리가 '권한' 이라고 불리우는 것엔 인증(Authentication)과 인가/승인(Authorization) 두가지 단어가 존재하는데, 인증(Authentication) 과 인가/승인(Authorization)은 비슷

inpa.tistory.com

 

https://www.youtube.com/watch?v=BotXDfBPvDA