Unisquads
로그인
홈
이용약관·개인정보처리방침·콘텐츠정책·© 2026 Unisquads
이용약관·개인정보처리방침·콘텐츠정책
© 2026 Unisquads. All rights reserved.

인증 및 인가 메커니즘 JWT 및 OAuth (r1)

이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.13 22:19

인증 및 인가 메커니즘 JWT 및 OAuth

이름

JWT 및 OAuth

분류

인증 및 인가 메커니즘

주요 목적

웹 및 API 보안 관리

JWT 정의

JSON Web Token, 정보를 JSON 객체로 안전하게 전송하기 위한 개방형 표준

OAuth 정의

OAuth 2.0, 제3자 애플리케이션에 대한 제한된 접근 권한을 부여하는 인가 프레임워크

관계

OAuth는 인가 흐름을, JWT는 인증 정보의 표현을 담당

주요 사용처

싱글 사인온, API 보안, 모바일 애플리케이션

기술 상세 정보

JWT 구조

Header, Payload, Signature 세 부분으로 구성

JWT 특징

자체 포함적, 디지털 서명 또는 암호화 가능, Stateless

OAuth 2.0 역할

Resource Owner, Client, Authorization Server, Resource Server

OAuth 2.0 권한 부여 유형

Authorization Code, Implicit, Resource Owner Password Credentials, Client Credentials

액세스 토큰

OAuth에서 리소스 접근에 사용되는 자격 증명

리프레시 토큰

액세스 토큰 만료 시 새로운 액세스 토큰을 얻는 데 사용

보안 고려사항

토큰 유출 방지, HTTPS 사용, 적절한 토큰 만료 시간 설정

JWT 취약점

서명 검증 생략, 알고리즘 변경 공견, 민감 정보 노출

OAuth 구현

OpenID Connect와 결합하여 인증 확장 가능

관련 표준

RFC 7519 (JWT), RFC 6749 (OAuth 2.0)

대체 기술

SAML, 서비스 계정

1. 개요

인증 및 인가 메커니즘에서 JWT와 OAuth는 현대 웹 및 모바일 애플리케이션의 보안과 사용자 경험을 구성하는 핵심 기술이다. 이 두 기술은 서로 다른 문제를 해결하지만, 종종 함께 사용되어 확장 가능하고 안전한 인증 및 인가 흐름을 구현한다.

인증은 사용자가 누구인지 확인하는 과정이며, 인가는 해당 사용자가 특정 자원에 접근할 권한이 있는지 결정하는 과정이다. JWT는 주로 인증된 사용자의 정보를 안전하게 전달하는 표준화된 토큰 형식으로 사용된다. 반면, OAuth 2.0은 제3자 애플리케이션이 사용자의 자원에 제한적으로 접근할 수 있도록 허용하는 인가 프레임워크를 정의한다.

이 문서는 JWT와 OAuth 2.0의 기본 개념, 구조, 작동 원리, 그리고 상호 연관성을 종합적으로 설명한다. 또한 두 기술을 효과적으로 결합하는 아키텍처 패턴, 보안 고려사항, 구현 시 참고할 모범 사례를 다룬다. 이를 통해 독자는 분산 시스템과 마이크로서비스 아키텍처 환경에서 사용자 신원과 접근 권한을 관리하는 방법에 대한 이해를 얻을 수 있다.

2. 인증(Authentication)과 인가(Authorization)의 기본 개념

인증(Authentication)은 사용자나 시스템의 신원을 확인하는 과정이다. 주로 "당신이 누구인가?"라는 질문에 답하는 역할을 한다. 일반적으로 사용자가 아이디와 비밀번호를 입력하여 자신이 주장하는 계정의 소유주임을 증명할 때 이루어진다. 이 과정을 통해 시스템은 사용자를 식별하고, 신원이 확인된 사용자에게 세션을 생성하거나 토큰을 발급한다.

인가(Authorization)는 인증된 사용자가 특정 자원(Resource)에 접근하거나 특정 작업을 수행할 수 있는 권한이 있는지를 검증하는 과정이다. "당신이 무엇을 할 수 있는가?"라는 질문을 다룬다. 예를 들어, 인증을 통해 관리자 계정으로 로그인한 사용자에게만 글을 삭제할 수 있는 권한을 부여하는 것이 인가에 해당한다. 인가는 보통 역할 기반 접근 제어(RBAC)나 권한 목록 등을 통해 관리된다.

두 개념은 명확히 구분되지만, 보안 프로세스에서 순차적으로 발생하는 밀접한 관계를 가진다. 일반적인 흐름은 다음과 같다.

1. 인증: 사용자가 자격 증명을 제출하여 신원을 확인받는다.

2. 인가: 확인된 신원을 바탕으로 시스템은 해당 사용자가 요청한 작업을 수행할 수 있는 권한이 있는지 판단한다.

즉, 인증 없이는 인가가 이루어질 수 없다. 인증은 신원 확인이라는 문을 열고, 인가는 그 안에서 허용된 행동의 범위를 정하는 것이다. 이 차이점을 혼동하면 잘못된 권한 관리로 이어져 보안 취약점을 초래할 수 있다.

2.1. 인증(Authentication)이란?

인증은 사용자나 시스템의 신원을 확인하는 과정이다. 주로 '당신이 누구인가?'라는 질문에 답하는 역할을 한다. 이 과정은 사용자가 주장하는 신원이 진짜인지 검증하는 것을 목표로 한다. 일반적으로 아이디와 비밀번호를 입력받아 데이터베이스에 저장된 정보와 대조하는 방식이 가장 널리 알려져 있다.

인증의 수단은 다양하다. 지식 기반 인증(비밀번호, PIN), 소유물 기반 인증(스마트카드, 보안 토큰), 생체 기반 인증(지문, 얼굴 인식) 등이 대표적이다. 최근에는 이러한 요소 중 두 가지 이상을 결합하는 다중 요소 인증(MFA)이 보안 강화를 위해 점차 표준으로 자리 잡고 있다.

인증이 성공하면, 시스템은 일반적으로 해당 사용자의 세션을 생성하거나 인증 토큰을 발급한다. 이 토큰은 이후 사용자의 요청이 이미 신원이 확인된 사용자로부터 온 것임을 증명하는 데 사용된다. 인증은 모든 보안 프로세스의 첫 번째 관문으로, 이후 이루어지는 인가 결정의 기초를 제공한다.

2.2. 인가(Authorization)이란?

인가는 인증을 통해 확인된 사용자나 시스템이 특정 자원이나 기능에 접근할 수 있는 권한이 있는지를 판단하는 과정이다. 즉, '무엇을 할 수 있는가'를 결정하는 절차이다. 인가 과정에서는 사용자의 신원, 역할(역할 기반 접근 제어), 소속 그룹, 또는 개별적으로 부여된 권한 목록과 같은 정보를 바탕으로 접근 요청을 허용하거나 거부한다.

인가 정책은 일반적으로 애플리케이션의 비즈니스 로직에 내재되어 있으며, 다양한 모델로 구현된다. 대표적인 모델로는 특정 작업 실행 권한을 부여하는 권한(Permission) 기반 모델, 사전에 정의된 역할(Role)에 권한을 할당하는 역할 기반 접근 제어(RBAC), 그리고 객체와 주체 간의 복잡한 관계를 규칙으로 표현하는 속성 기반 접근 제어(ABAC) 등이 있다.

예를 들어, 문서 관리 시스템에서 사용자가 'A문서.pdf' 파일을 삭제하려고 할 때, 시스템은 먼저 해당 사용자가 로그인한 유효한 사용자인지 확인한다(인증). 그 후, 이 사용자가 'A문서.pdf'에 대한 삭제 권한을 가지고 있는지, 또는 '관리자' 역할을 보유하고 있는지 등을 검증한다(인가). 이 검증을 통해 권한이 부여된 경우에만 삭제 작업이 수행된다.

개념

핵심 질문

설명 예시

인증(Authentication)

"당신은 누구인가?"

아이디와 비밀번호로 로그인하여 사용자 신원을 확인한다.

인가(Authorization)

"당신은 이것을 할 수 있는가?"

로그인한 사용자가 특정 게시글을 수정하거나 관리자 페이지에 접근할 수 있는지를 판단한다.

이러한 인가 메커니즘은 API 엔드포인트 접근 제어, 파일 시스템 권한 설정, 데이터베이스 레코드에 대한 CRUD 작업 제한 등 소프트웨어 시스템의 보안과 데이터 무결성을 유지하는 데 필수적이다.

2.3. 두 개념의 관계와 차이점

인증과 인가는 정보 보안의 핵심 개념으로, 서로 밀접하게 연관되어 있지만 명확히 구분되는 목적을 가진다. 인증은 사용자나 시스템의 신원을 확인하는 과정이며, 인가는 해당 신원이 특정 자원이나 기능에 접근할 권한이 있는지를 결정하는 과정이다.

두 개념의 관계는 순차적이고 계층적이다. 일반적으로 인증이 먼저 수행되어 신원이 검증된 후, 그 신원을 바탕으로 인가가 이루어진다. 예를 들어, 사용자가 로그인(인증)을 성공하면 시스템은 해당 사용자의 역할(Role)이나 권한(Permission)을 확인하여 특정 파일을 열거나 관리자 페이지에 접근할 수 있는지(인가)를 판단한다. 인증 없이는 의미 있는 인가 결정을 내릴 수 없다.

차이점은 다음과 같이 요약할 수 있다.

구분

인증 (Authentication)

인가 (Authorization)

핵심 질문

"당신은 누구인가?"

"당신이 무엇을 할 수 있는가?"

주요 목적

신원 확인

접근 권한 부여

확인 대상

사용자, 디바이스, 시스템

권한, 역할, 접근 범위

수행 시점

일반적으로 접근 초기 단계

인증 이후, 자원 접근 시

예시

아이디/비밀번호 입력, 지문 인식

문서 읽기 권한, 관리자 기능 사용 권한

따라서 인증은 접근의 출입문을 여는 열쇠 역할을 하고, 인가는 건물 내부에서 각 방에 들어갈 수 있는 권한을 규정하는 내부 규칙에 비유할 수 있다. 효과적인 보안 체계를 구축하기 위해서는 이 두 메커니즘을 명확히 구분하고, 각각에 적합한 기술(예: JWT를 통한 인증, OAuth 스코프(Scope)를 통한 인가)을 적용하는 것이 중요하다.

3. JWT(JSON Web Token)의 이해

JWT는 당사자 간에 정보를 JSON 객체로 안전하게 전송하기 위한 개방형 표준(RFC 7519)이다. 이 정보는 디지털 서명되어 있어 신뢰할 수 있다. JWT는 HMAC 알고리즘을 이용한 비밀키나, RSA 또는 ECDSA를 이용한 공개키/개인키 쌍으로 서명할 수 있다. 주로 인증과 인가에 사용되며, 액세스 토큰의 형태로 널리 활용된다.

JWT의 구조는 점('.')으로 구분된 세 부분으로 이루어져 있다.

* 헤더(Header): 토큰의 유형(일반적으로 'JWT')과 서명에 사용된 알고리즘(예: HS256, RS256)을 지정한다.

* 페이로드(Payload): 클레임(claim)을 포함한다. 클레임은 엔티티(일반적으로 사용자)와 추가 데이터에 대한 진술이다. 등록된 클레임(예: 'exp' 만료 시간, 'sub' 주제), 공개 클레임, 비공개 클레임으로 구분된다.

* 서명(Signature): 인코딩된 헤더, 인코딩된 페이로드, 비밀키를 사용하여 지정된 알고리즘으로 생성된다. 이 서명은 메시지가 도중에 변경되지 않았는지 검증하고, 비밀키로 서명된 토큰의 경우 발급자를 확인하는 역할을 한다.

JWT의 일반적인 작동 흐름은 다음과 같다. 사용자가 로그인 자격 증명을 제공하면, 인증 서버는 이를 검증하고 JWT를 생성하여 클라이언트에게 반환한다. 클라이언트는 이후 보호된 리소스에 접근할 때마다 이 JWT를 (일반적으로 Authorization 헤더에 담아) 서버에 전송한다. 서버는 JWT의 서명을 검증하고, 페이로드의 정보를 신뢰하여 사용자 식별 및 권한 확인을 수행한다. 이 방식은 서버가 사용자 세션 상태를 유지할 필요가 없게 만든다.

JWT의 주요 장점은 상태 비저장성과 이에 따른 확장성 용이성, 다양한 플랫폼 간 호환성, 그리고 페이로드 자체에 필요한 정보를 포함할 수 있는 자체 포함성이다. 반면, 토큰이 한번 발급되면 만료 시간 전에는 취소가 어려워 토큰 탈취에 취약할 수 있으며, 페이로드 정보가 암호화되지 않은 경우(Base64Url로 인코딩만 됨) 민감한 정보를 담으면 안 된다는 단점도 있다. 또한 토큰 크기가 세션 쿠키에 비해 커질 수 있어 요청 오버헤드가 증가할 수 있다.

3.1. JWT의 구조(Header, Payload, Signature)

JWT는 점('.')으로 구분된 세 부분, 즉 헤더(Header), 페이로드(Payload), 서명(Signature)으로 구성된다. 이 세 부분은 각각 Base64Url 인코딩되어 있으며, 이를 결합하여 최종적인 JWT 문자열을 형성한다[1].

헤더는 일반적으로 토큰의 유형(typ)과 사용된 서명 알고리즘(alg) 두 가지 정보를 담는다. 가장 일반적인 형태는 {"alg": "HS256", "typ": "JWT"}와 같다. 페이로드는 토큰에 담을 정보인 클레임(Claim)들을 포함한다. 클레임은 등록된 클레임(Registered claims), 공개 클레임(Public claims), 비공개 클레임(Private claims)으로 분류된다. 등록된 클레임은 미리 정의된 의미를 가진 권장 클레임으로, 발급자(iss), 주제(sub), 수신자(aud), 만료 시간(exp), 발행 시간(iat) 등이 있다.

서명 부분은 인코딩된 헤더, 점, 인코딩된 페이로드를 합친 문자열을, 헤더에 지정된 알고리즘과 비밀 키(Secret Key) 또는 공개/개인 키 쌍을 사용하여 생성한다. 이 서명은 토큰이 전송 중에 변조되지 않았음을 검증하는 데 사용된다. 세 부분의 구조는 다음 표와 같이 요약할 수 있다.

부분

내용

설명

예시 (인코딩 전)

Header

토큰 메타데이터

사용된 알고리즘과 토큰 유형 정의

{"alg": "HS256", "typ": "JWT"}

Payload

클레임(정보)

실제 전달할 데이터(주체, 권한, 기타 속성)

{"sub": "12345", "name": "John Doe", "iat": 1516239022}

Signature

전자 서명

헤더와 페이로드의 무결성 보장

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

최종적인 JWT는 헤더.페이로드.서명의 형태를 띤다. 예를 들어, 생성된 JWT는 xxxxx.yyyyy.zzzzz와 같은 모습이다. 클라이언트는 이 토큰을 보관하고, 보호된 리소스에 접근할 때 HTTP 요청의 Authorization 헤더에 담아 서버로 전송한다. 수신한 서버는 서명을 검증하여 토큰의 유효성과 무결성을 확인한 후, 페이로드에 담긴 클레임 정보를 신뢰하고 사용한다.

3.2. JWT의 작동 원리와 흐름

JWT는 일반적으로 클라이언트가 서버에 인증 정보(예: 사용자명과 비밀번호)를 제출한 후, 서버가 그 유효성을 검증하고 발급하는 액세스 토큰으로 사용된다. 기본적인 작동 흐름은 다음과 같다. 먼저, 사용자가 클라이언트 애플리케이션을 통해 로그인 자격 증명을 제출한다. 그런 다음, 인증 서버는 해당 자격 증명을 검증하고, 검증이 성공하면 서명된 JWT를 생성하여 클라이언트에게 응답으로 반환한다. 클라이언트는 이 JWT를 로컬에 저장한 후(주로 로컬 스토리지나 쿠키), 이후 보호된 리소스 서버(API 서버)에 요청을 보낼 때마다 HTTP 요청의 Authorization 헤더에 이 토큰을 담아 전송한다. 리소스 서버는 토큰의 서명을 검증하고, 페이로드에 포함된 정보를 신뢰하여 요청을 처리한다.

JWT의 핵심 작동 원리는 디지털 서명에 기반한 자기 수용적(self-contained) 정보 전달에 있다. 토큰 자체에 서명이 포함되어 있기 때문에, 리소스 서버는 토큰 발급자(인증 서버)에 별도로 문의하지 않고도 토큰의 진위와 무결성을 검증할 수 있다. 이는 상태 비저장(Stateless) 아키텍처를 가능하게 하는 중요한 특징이다. 서버는 사용자 세션 상태를 메모리나 데이터베이스에 유지할 필요 없이, 들어오는 각 JWT의 서명만 검증하면 된다.

다음은 JWT 기반 인증의 일반적인 시퀀스를 나타낸다.

단계

주체

동작

설명

1

클라이언트

로그인 요청

사용자 자격 증명을 인증 서버에 제출한다.

2

인증 서버

자격 증명 검증 및 JWT 생성

자격 증명을 확인하고, 서명된 JWT를 생성하여 클라이언트에 발급한다.

3

클라이언트

JWT 저장 및 API 요청

발급받은 JWT를 저장하고, 보호된 API를 호출할 때 헤더에 포함시킨다.

4

리소스 서버

JWT 검증 및 요청 처리

토큰의 서명과 유효 기간을 검증한 후, 페이로드의 정보를 바탕으로 요청을 수행한다.

이 흐름에서 주의할 점은, JWT가 발급된 후에는 서버 측에서 강제로 폐기하기 어렵다는 것이다. 토큰의 유효 기간이 만료될 때까지는 유효한 것으로 간주되므로, 토큰 탈취 시 발생할 수 있는 보안 위험을 완화하기 위해 비교적 짧은 유효 기간을 설정하는 것이 일반적인 모범 사례이다. 또한, 민감한 정보는 토큰 페이로드에 포함하지 않아야 하며, 서명 검증을 반드시 수행해야 한다.

3.3. JWT의 장점과 단점

JWT는 무상태성을 기반으로 하여 서버 측에서 세션 정보를 저장할 필요가 없다. 이는 서버의 부하를 줄이고 확장성을 높이는 데 기여한다. 또한 JSON 형식의 토큰은 다양한 프로그래밍 언어와 플랫폼에서 쉽게 파싱하고 처리할 수 있어 범용성이 뛰어나다. 토큰 자체에 필요한 정보(클레임)를 포함할 수 있어, 데이터베이스 조회 없이도 사용자 정보를 확인하는 데 사용될 수 있다.

하지만 JWT는 한번 발급되면 만료 시간이 도래하기 전에는 폐기하기 어렵다는 단점을 가진다. 이는 토큰이 탈취당했을 때 발생하는 보안 문제로 이어진다. 세션 방식은 서버 측에서 세션을 무효화할 수 있지만, JWT는 일반적으로 블랙리스트를 관리하는 추가 메커니즘 없이는 중간에 취소할 수 없다.

또한 토큰의 페이로드는 암호화되지 않고 단지 Base64Url로 인코딩되어 있기 때문에, 민감한 정보를 저장하는 데는 적합하지 않다. 누구나 디코딩하여 내용을 볼 수 있기 때문이다. 토큰의 크기가 세션 ID에 비해 상대적으로 커질 수 있어, 매 요청마다 전송되는 오버헤드가 발생할 수 있다.

장점

단점

무상태성 및 서버 확장성 용이

발급 후 만료 전 취소(Revocation)가 어려움

다양한 언어/플랫폼 호환성(JSON 기반)

페이로드가 암호화되지 않아 민감 정보 저장 부적합

자체 포함적(Self-contained)으로 필요한 정보를 토큰에 포함 가능

토큰 크기가 커져 네트워크 오버헤드 발생 가능

서명을 통한 무결성 보장

서명 키 관리가 중요하며 유출 시 전체 시스템 위험[2]

4. OAuth 2.0 프레임워크의 이해

OAuth 2.0은 제3의 애플리케이션이 HTTP 서비스의 사용자 계정에 대한 제한된 접근 권한을 얻을 수 있도록 하는 권한 부여 프레임워크이다. 이 프레임워크는 사용자가 암호를 공유하지 않고도 다른 웹사이트나 애플리케이션에 자신의 자원에 대한 접근 권한을 위임할 수 있게 해준다. 예를 들어, 사용자가 소셜 미디어 계정으로 다른 서비스에 로그인하거나, 클라우드 저장소의 사진을 인쇄 서비스에 공유할 때 OAuth 2.0이 작동한다. 이는 사용자의 자격 증명을 직접 노출시키지 않는 더 안전한 위임 접근 방식을 제공하기 위해 등장하였다.

OAuth 2.0의 핵심은 네 가지 주요 역할로 구성된다.

* 리소스 오너(Resource Owner): 일반적으로 애플리케이션 사용자로, 보호된 자원에 접근 권한을 부여할 수 있는 주체이다.

* 클라이언트(Client): 보호된 자원에 접근을 요청하는 애플리케이션(예: 웹사이트, 모바일 앱)이다.

* 권한 부여 서버(Authorization Server): 리소스 오너의 인증을 확인하고, 클라이언트에게 액세스 토큰을 발급하는 서버이다.

* 리소스 서버(Resource Server): 보호된 자원(예: 사용자 프로필, 사진 파일)을 호스팅하고, 유효한 액세스 토큰을 가진 요청을 수락하는 서버이다.

이러한 역할 간의 상호작용은 특정 권한 부여 방식(Grant Type)에 따라 이루어진다. 상황에 맞는 적절한 방식을 선택하여 사용한다.

권한 부여 방식(Grant Type)

주요 사용 사례

특징

권한 부여 코드 방식 (Authorization Code Grant)

서버 사이드 웹 애플리케이션

가장 안전한 방식. 클라이언트가 사용자를 인증 서버로 리다이렉트한 후, 인증 코드를 교환해 토큰을 얻는다.

암시적 방식 (Implicit Grant)

자바스크립트 기반 단일 페이지 애플리케이션(SPA)

액세스 토큰이 브라우저를 통해 직접 전달된다. 보안상 리프레시 토큰을 발급하지 않는다.

리소스 오너 암호 자격 증명 방식 (Resource Owner Password Credentials Grant)

신뢰할 수 있는 클라이언트(예: 공식 모바일 앱)

사용자 아이디와 비밀번호를 직접 클라이언트에 입력하여 토큰을 얻는다. 높은 신뢰 관계가 전제된다.

클라이언트 자격 증명 방식 (Client Credentials Grant)

클라이언트 자신의 자원 접근(기계 대 기계)

사용자 대신 클라이언트 애플리케이션 자신이 보호된 자원에 접근할 때 사용한다.

이 프레임워크는 인증(Authentication) 자체를 정의하는 것이 아니라, 안전한 권한 위임과 접근 제어에 초점을 맞춘다.

4.1. OAuth 2.0의 역할과 등장 배경

OAuth 2.0은 제3의 애플리케이션이 사용자의 자원에 제한적으로 접근할 수 있도록 허용하는 인가 프레임워크이다. 그 핵심 역할은 사용자가 자신의 비밀번호를 제3자에게 노출시키지 않으면서도, 특정 자원에 대한 접근 권한을 안전하게 위임할 수 있게 하는 것이다. 예를 들어, 소셜 미디어 앱이 사용자의 구글 캘린더에 일정을 추가하거나, 뉴스 애플리케이션이 사용자의 트위터 계정에 글을 자동으로 올릴 수 있도록 허용하는 과정에서 OAuth 2.0이 사용된다.

OAuth 2.0의 등장 배경은 OAuth 1.0의 복잡성과 실용적인 문제를 해결하기 위해서이다. 2006년에 시작된 OAuth 1.0 프로토콜은 디지털 서명을 기반으로 한 강력한 보안 모델을 제공했지만, 구현이 복잡하고 클라이언트 측 개발자에게 부담이 컸다. 특히 모바일 애플리케이션이나 데스크톱 애플리케이션과 같은 네이티브 앱에서의 적용이 어려웠다. 또한, 암호화가 아닌 서명을 사용했기 때문에 HTTPS 사용이 필수가 아니라는 점도 보안상 논란의 여지가 있었다.

이러한 문제점을 극복하기 위해 2012년에 공식 표준으로 채택된 OAuth 2.0은 설계 철학을 크게 바꾸었다. 핵심 변화는 다음과 같다.

구분

OAuth 1.0

OAuth 2.0

보안 기반

암호학적 서명

TLS/SSL(HTTPS) 암호화 채널

복잡도

높음 (서명 생성/검증 필수)

상대적으로 낮음

클라이언트 유형

제한적 구분

웹 애플리케이션, 사용자 에이전트 기반 애플리케이션, 네이티브 애플리케이션, 리소스 소유자 패스워드 자격 증명 등 세분화된 권한 부여 방식 지원

토큰 갱신

명시적 메커니즘 없음

전용 리프레시 토큰 도입

결과적으로 OAuth 2.0은 더 간단하고 유연한 프레임워크가 되어, 다양한 현대 애플리케이션 환경(모바일, 싱글 페이지 애플리케이션, IoT 디바이스 등)에서 폭넓게 채택되는 산업계의 사실상(de facto) 표준이 되었다.

4.2. OAuth 2.0의 주요 구성 요소(Resource Owner, Client, Authorization Server, Resource Server)

OAuth 2.0 프레임워크는 네 가지 핵심 역할로 정의된 구성 요소 간의 상호작용을 통해 동작한다. 이 구성 요소들은 각각 명확한 책임을 가지며, 안전한 위임된 인가를 가능하게 한다.

주요 구성 요소는 다음과 같다.

역할 (Role)

설명 (Description)

예시 (Example)

Resource Owner

보호된 자원에 대한 접근 권한을 부여할 수 있는 주체이다.

일반적으로 최종 사용자인 사용자를 의미한다.

Client

Resource Owner를 대신하여 보호된 자원에 접근을 요청하는 애플리케이션이다.

웹 사이트, 모바일 앱, 데스크톱 애플리케이션 등이 해당된다.

Authorization Server

Resource Owner의 인증을 수행하고, Client에게 액세스 토큰을 발급하는 서버이다.

Google, Facebook, GitHub 등의 로그인 서비스가 이 역할을 담당한다.

Resource Server

보호된 자원을 호스팅하고, 유효한 액세스 토큰을 가진 요청에 대해 자원을 제공하는 서버이다.

사용자의 프로필 사진이나 이메일 주소를 저장하는 API 서버가 해당된다.

Resource Owner는 Client가 자신의 자원에 접근하도록 허용한다. Client는 Authorization Server를 통해 Resource Owner로부터 인가를 받고, 그 증표인 액세스 토큰을 획득한다. 이후 Client는 이 토큰을 Resource Server에 제시하여 실제 자원(예: 사용자 데이터)에 접근한다. Authorization Server와 Resource Server는 동일한 서비스 제공자 내에 존재할 수도 있고, 분리되어 있을 수도 있다. 이 분리된 아키텍처는 마이크로서비스 환경에서 특히 중요하게 작동한다.

4.3. 대표적인 권한 부여 방식(Grant Types)

OAuth 2.0은 다양한 애플리케이션 시나리오를 지원하기 위해 여러 권한 부여 방식을 정의한다. 각 방식은 클라이언트의 유형과 신뢰 수준, 리소스 오너의 참여 방식에 따라 적합한 상황이 다르다.

가장 일반적으로 사용되는 방식은 다음과 같다.

권한 부여 방식

설명

주요 사용 사례

Authorization Code

클라이언트가 사용자를 인증 서버로 리다이렉트하여 인증 후, 권한 부여 코드를 받아 액세스 토큰과 교환한다.

서버 측에서 실행되는 웹 애플리케이션. 가장 안전한 방식으로 간주된다.

Implicit

권한 부여 코드 단계를 생략하고, 리다이렉트를 통해 직접 액세스 토큰을 발급한다.

브라우저 기반 자바스크립트 애플리케이션(단, 보안상 현대에는 권장되지 않음).

Resource Owner Password Credentials

리소스 오너의 아이디와 비밀번호를 직접 클라이언트가 받아 인증 서버에 제출하고 토큰을 발급받는다.

높은 신뢰를 가진 클라이언트(예: 공식 모바일 앱) 또는 레거시 시스템 마이그레이션 시.

Client Credentials

클라이언트가 자신의 자격 증명(클라이언트 ID와 시크릿)으로 인증 서버에 인증하여 토큰을 발급받는다.

사용자 대신 클라이언트 자체가 보호된 리소스에 접근해야 하는 서버 간 통신(머신 투 머신).

권한 부여 코드 방식은 보안성이 가장 뛰어나 표준적인 웹 애플리케이션에서 널리 채택된다. 이 방식에서는 민감한 액세스 토큰이 사용자의 브라우저를 직접 거치지 않고 서버 간에 교환된다. 암시적 방식은 단순하지만 토큰이 브라우저 히스토리나 로그에 노출될 위험이 있어, OpenID Connect와 같은 현대 프로토콜에서는 사용을 지양한다.

클라이언트 자격 증명 방식은 사용자 컨텍스트가 없는 서비스 계정이나 백그라운드 프로세스에 적합하다. 리소스 오너 패스워드 자격 증명 방식은 사용자의 자격 증명을 클라이언트가 처리해야 하므로, 해당 클라이언트를 완전히 신뢰할 수 있는 매우 제한된 경우에만 사용해야 한다. 또한, 인증 서버는 보안을 강화하기 위해 발급된 토큰에 JWT를 활용할 수 있다.

5. JWT와 OAuth 2.0의 관계 및 활용

OAuth 2.0은 권한 부여를 위한 프레임워크이며, JWT는 정보를 안전하게 전달하기 위한 토큰 형식이다. 이 둘은 상호 보완적인 관계에 있으며, 현대 웹 애플리케이션과 API 보안에서 함께 자주 사용된다. OAuth 2.0이 '무엇을 할 수 있는 권한을 줄 것인가'에 대한 틀을 제공한다면, JWT는 그 권한을 나타내는 자격 증명(토큰)의 구체적인 형태 중 하나로 활용된다.

OAuth 2.0에서 발급되는 액세스 토큰은 불투명한 문자열일 수도 있지만, JWT 형식을 채택하는 경우가 매우 일반적이다. JWT를 액세스 토큰으로 사용하면, 토큰 자체에 클레임이라는 형태로 사용자 정보나 권한 범위(스코프)를 포함할 수 있다. 이는 리소스 서버가 토큰의 유효성을 검증하기 위해 매번 인증 서버에 문의할 필요 없이, 서명을 검증하고 토큰 내부의 정보를 직접 파싱하여 처리할 수 있게 한다. 이 방식을 자체 포함 토큰 또는 Bearer Token 방식이라고 한다.

두 기술을 함께 사용하는 일반적인 아키텍처 패턴은 다음과 같다.

1. 클라이언트가 인증 서버에 사용자 자격 증명이나 동의를 통해 인증을 요청한다.

2. 인증 서버는 검증 후, 사용자 정보와 권한 스코프를 담은 JWT 형식의 액세스 토큰을 생성하여 발급한다.

3. 클라이언트는 이 JWT를 가지고 리소스 서버(예: 사용자 데이터를 제공하는 API)에 요청을 보낸다.

4. 리소스 서버는 JWT의 서명을 공개된 키로 검증하여 토큰의 무결성과 발급자를 확인한 후, 토큰 내 페이로드에 명시된 권한에 따라 요청을 처리한다.

이러한 조합은 마이크로서비스 아키텍처 환경에서 특히 효과적이다. 여러 개의 분리된 서비스(리소스 서버)가 각각 독립적으로 토큰을 검증하고 사용자 컨텍스트를 이해할 수 있기 때문이다. 그러나 JWT의 자체 포함 특성은 토큰을 중간에 폐기하기 어렵게 만드는 단점도 있다. 이를 보완하기 위해 토큰의 수명을 짧게 유지하고, 리프레시 토큰을 활용하여 새로운 액세스 토큰을 주기적으로 발급받는 전략이 사용된다.

5.1. OAuth 2.0에서 JWT의 사용 예시(Access Token으로서의 JWT)

OAuth 2.0 프레임워크는 액세스 토큰의 구체적인 형식을 규정하지 않는다. 이는 구현체의 자유도를 보장하는 설계 선택이다. JWT는 이러한 액세스 토큰으로 널리 채택된 형식 중 하나이다. 인증 서버는 권한 부여를 완료한 후, 클라이언트에게 JWT 형식의 액세스 토큰을 발급할 수 있다.

JWT가 액세스 토큰으로 사용될 때의 주요 이점은 자체 포함성(self-contained)이다. 토큰의 페이로드 섹션에 클라이언트 식별자, 사용자 권한(스코프), 만료 시간 등의 필요한 정보를 직접 인코딩할 수 있다. 이는 리소스 서버가 매 요청마다 인증 서버에 토큰을 검증하러 갈 필요 없이, 서명을 검증하고 페이로드를 디코딩함으로써 토큰의 유효성과 권한을 즉시 판단할 수 있게 한다. 이 방식은 상태를 저장하지 않는(Stateless) 서버 아키텍처와 잘 맞으며, 인증 서버에 대한 의존성과 조회 부하를 줄여 확장성을 높인다.

그러나 이 접근 방식에는 주의사항이 따른다. JWT는 일단 발급되면 만료 시간이 도래하기 전에는 중간에 폐기(revoke)하기 어렵다는 특징을 가진다. 이는 보안 상의 취약점으로 작용할 수 있다. 이를 완화하기 위해 짧은 만료 시간을 사용하고, 리프레시 토큰을 함께 발급하여 주기적으로 새로운 액세스 토큰으로 교체하는 전략이 일반적이다. 또한, 민감한 사용자 정보를 페이로드에 포함시키면 토큰이 탈취되었을 때 정보가 노출될 위험이 있으므로, 필요한 최소한의 정보만 포함시키는 것이 모범 사례이다.

토큰 형식

주요 특징

OAuth 2.0에서의 역할

불투명 토큰(Opaque Token)

의미 없는 문자열, 상태 저장 필요

인증 서버의 조회를 통해서만 검증 가능

JWT 형식 토큰

자체 포함, 서명으로 무결성 보장

리소스 서버가 독립적으로 검증 가능

결론적으로, OAuth 2.0에서 JWT는 액세스 토큰의 효율적인 구현체로 동작한다. 이 조합은 분산 시스템에서 표준화된 방식으로 권한을 전달하고 검증하는 강력한 메커니즘을 제공하지만, 토큰의 수명 관리와 정보 노출에 대한 신중한 설계가 필요하다.

5.2. 두 기술을 함께 사용하는 일반적인 아키텍처 패턴

OAuth 2.0은 권한 부여 프레임워크를 제공하고, JWT는 그 권한을 증명하는 토큰의 구체적인 형식 중 하나로 사용된다. 두 기술을 함께 사용하는 가장 일반적인 패턴은 OAuth 2.0의 액세스 토큰을 JWT 형식으로 발급하는 것이다. 이 경우 인가 서버는 사용자의 인증 및 권한 부여를 완료한 후, 사용자 정보와 권한 범위(스코프)를 페이로드에 담고 서명된 JWT를 생성하여 클라이언트에게 전달한다. 클라이언트는 이 JWT를 액세스 토큰으로 사용하여 리소스 서버에 API 요청을 보낸다.

리소스 서버는 전달받은 JWT의 서명을 공개 키로 검증하여 토큰의 진위와 무결성을 확인한다. 서명 검증이 성공하면, 리소스 서버는 별도의 데이터베이스 조회 없이도 JWT 페이로드에 포함된 정보(예: 사용자 식별자, 권한, 토큰 만료 시간)를 직접 파싱하여 요청을 처리할 수 있다. 이는 상태 비저장 아키텍처를 구현하는 데 핵심적인 역할을 하며, 서버의 확장성을 높여준다.

보다 정교한 패턴으로는 JWT를 리프레시 토큰과 함께 사용하는 방식이 있다. 짧은 수명의 JWT를 액세스 토큰으로, 긴 수명의 불투명한 토큰을 리프레시 토큰으로 발급한다. 액세스 토큰이 만료되면 클라이언트는 리프레시 토큰을 사용해 인가 서버에 새로운 액세스 토큰을 요청한다. 이 패턴은 보안성을 강화하면서도 사용자 경험을 유지한다.

또한, 마이크로서비스 아키텍처 환경에서는 JWT가 서비스 간의 신원 전파 수단으로 널리 활용된다. 초기 인증을 마친 사용자에 대한 JWT가 생성되면, 이 토큰은 여러 하위 서비스로 전달된다. 각 서비스는 중앙 인가 서버에 문의하지 않고도 JWT를 검증하여 사용자 컨텍스트를 이해하고 권한을 확인할 수 있다. 이는 API 게이트웨이가 토큰을 검증하고 하위 서비스로 전달하는 구조와 잘 결합된다.

6. 보안 고려사항과 모범 사례

JWT를 안전하게 사용하기 위해서는 몇 가지 중요한 주의점이 존재합니다. 가장 큰 위험은 토큰이 탈취되는 경우인데, JWT는 기본적으로 상태를 저장하지 않으므로 한번 발급되면 만료 시간이 도래하기 전까지 무효화하기 어렵습니다. 따라서 토큰의 만료 시간(exp 클레임)을 짧게(예: 15분) 설정하고, 장기적인 접근이 필요할 경우 Refresh Token을 별도로 관리하는 전략이 권장됩니다. 또한 서버는 반드시 JWT의 서명(Signature)을 검증하여 토큰이 변조되지 않았는지 확인해야 합니다. 적절하지 않은 암호화 알고리즘(예: none)을 허용하거나, 비밀 키(Secret Key)가 유출되면 공격자가 임의의 토큰을 생성할 수 있게 됩니다.

OAuth 2.0 구현 시에는 인가 흐름(Authorization Flow)의 각 단계에서 보안 취약점이 발생하지 않도록 주의해야 합니다. 가장 일반적인 권한 부여 코드 방식(Authorization Code Grant)을 사용할 때, 인가 코드(Authorization Code)는 반드시 안전한 백엔드 채널을 통해 교환되어야 하며 클라이언트 측에 노출되어서는 안 됩니다. 리디렉션 URI(Redirect URI)는 정확하게 등록하고 검증하여 피싱 공격을 방지해야 합니다. 또한 클라이언트 비밀번호(Client Secret)의 안전한 저장과 전송, Access Token이 노출될 수 있는 프론트엔드 채널에서는 암호 방식(Resource Owner Password Credentials Grant)의 사용을 지양하는 것이 모범 사례입니다.

두 기술을 함께 사용할 때의 보안 강화를 위해 다음과 같은 추가 조치를 고려할 수 있습니다.

고려사항

설명

모범 사례 예시

토큰 저장

클라이언트 측에서 Access Token을 안전하게 저장합니다.

브라우저에서는 HttpOnly 쿠키 사용을 고려합니다.

토큰 범위

토큰에 부여되는 권한(Scope)을 최소한으로 제한합니다.

read:profile만 필요한 경우 write:profile 권한은 부여하지 않습니다.

감사 및 모니터링

토큰 발급 및 사용 로그를 기록하고 비정상적인 접근을 탐지합니다.

갑작스러운 다량의 토큰 발급 요청이나 알려지지 않은 지리적 위치에서의 접근을 모니터링합니다.

정기적 키 순환

서명에 사용되는 암호화 키를 정기적으로 변경합니다.

JWK(JSON Web Key) 세트를 이용한 키 순환 메커니즘을 도입합니다.

마지막으로, OAuth 2.0은 인가 프레임워크이며 인증을 위한 완전한 프로토콜은 아니라는 점을 인지하는 것이 중요합니다. 사용자 인증 정보를 안전하게 처리하고 신원을 확인하기 위해서는 OAuth 2.0 위에 구축된 OpenID Connect(OIDC)와 같은 레이어를 추가로 적용하는 것이 현대적인 보안 아키텍처에서 일반적입니다.

6.1. JWT 관련 보안 주의점(토큰 탈취, 서명 검증)

JWT는 그 구조와 사용 방식으로 인해 몇 가지 고유한 보안 취약점을 가질 수 있다. 가장 큰 위험은 토큰 자체가 탈취되는 경우이다. JWT는 기본적으로 상태를 저장하지 않기([3]), 한 번 발급되면 만료 시간이 도래하기 전까지는 무효화하기 어렵다. 따라서 토큰이 유출되면 공격자는 유효 기간 내에 해당 토큰의 권한을 그대로 행사할 수 있다. 이를 완화하기 위해 토큰의 만료 시간(exp 클레임)을 짧게 설정하고, Refresh Token을 사용하여 주기적으로 새로운 액세스 토큰을 발급받는 방식을 적용한다. 또한 중요한 작업에 대해서는 추가적인 인증(예: 비밀번호 재입력)을 요구하는 것이 좋다.

서명 검증의 누락은 치명적인 보안 허점이다. JWT의 무결성과 신뢰성은 전적으로 서명(Signature)에 의존한다. 서버는 수신한 토큰의 서명을 반드시 발급자(iss 클레임)의 비밀 키(HMAC) 또는 공개 키(RSA/ECDSA)를 사용하여 검증해야 한다. 특히 알고리즘 헤더를 조작하는 공격(Algorithm Confusion Attack)을 방지하기 위해, 서버는 허용할 서명 알고리즘을 명시적으로 지정하고 클라이언트가 제시하는 알고리즘을 그대로 수용해서는 안 된다. "none" 알고리즘 사용은 절대 허용하지 않아야 한다.

토큰에 저장되는 정보의 민감성도 고려해야 한다. 페이로드는 서명으로 보호되지만, 기본적으로 암호화되지 않기 때문에 누구나 Base64Url 디코딩을 통해 내용을 읽을 수 있다. 따라서 JWT 내부에는 비밀번호나 개인 식별 정보(PII)와 같은 민감 데이터를 포함시키지 말아야 한다. 필요한 경우 JWE(JSON Web Encryption)를 사용하여 토큰 전체를 암호화할 수 있다. 또한 클레임을 과도하게 많이 포함시키면 토큰 크기가 커져 네트워크 오버헤드를 증가시킬 수 있다.

주의점

설명

완화 방안

토큰 탈취

유효 기간 내 토큰 무효화 어려움

짧은 만료 시간 설정, Refresh Token 사용, 중요 작업 시 재인증

서명 검증 생략

토큰 위조 및 변조 가능

발급자 키로 반드시 서명 검증, 허용 알고리즘 명시적 지정

민감 정보 저장

페이로드가 암호화되지 않음

민감 데이터 저장 금지, 필요 시 JWE 사용

알고리즘 조작

"none" 알고리즘 등 강제 시도

알고리즘 검증 로직 강화, 외부 입력 신뢰 금지

6.2. OAuth 2.0 구현 시 보안 고려사항

OAuth 2.0 구현 시 보안을 유지하기 위해서는 프레임워크의 설계 원칙을 정확히 이해하고 여러 공격 벡터에 대비해야 한다. 가장 중요한 원칙 중 하나는 클라이언트 시크릿의 안전한 관리이다. 서버 사이드 애플리케이션의 경우 시크릿은 절대 클라이언트 측에 노출되어서는 안 되며, 안전한 백엔드 저장소에 보관해야 한다. 모바일 앱이나 싱글 페이지 애플리케이션과 같은 퍼블릭 클라이언트는 시크릿을 안전하게 저장할 수 없으므로, 인가 코드 흐름과 PKCE를 반드시 조합하여 사용해야 한다. PKCE는 인가 코드를 탈취당했을 때도 액세스 토큰 교환을 방지하는 추가 보안 계층을 제공한다.

리디렉션 URI의 검증은 또 다른 핵심 보안 조치이다. 인가 서버는 사전에 등록된 정확한 리디렉션 URI로만 응답을 전송해야 하며, 등록되지 않거나 변조된 URI에 대한 요청은 거부해야 한다. 이를 통해 공격자가 토큰을 자신이 통제하는 엔드포인트로 유도하는 공격을 차단할 수 있다. 또한, 발급된 액세스 토큰은 가능한 짧은 수명을 가지도록 설정하고, 리프레시 토큰은 더 엄격하게 보호해야 한다. 리프레시 토큰은 반드시 안전한 저장소에 보관하고, 토큰 순환 정책을 적용하여 재사용을 탐지하고 차단하는 메커니즘을 마련하는 것이 좋다.

고려사항

설명

주요 위협

클라이언트 자격 증명 관리

퍼블릭 클라이언트는 시크릿 사용을 피하고 PKCE를 사용해야 한다.

자격 증명 탈취

리디렉션 URI 검증

등록된 URI와 정확히 일치하는지 철저히 검증해야 한다.

오픈 리디렉터 공격

토큰 수명 관리

액세스 토큰은 짧게, 리프레시 토큰은 안전하게 저장 및 관리해야 한다.

토큰 탈취 및 재사용

상태 매개변수 사용

인가 요청 시 임의의 상태 값을 포함하여 CSRF 공격을 방지해야 한다.

크로스 사이트 요청 위조

마지막으로, 인가 서버와 리소스 서버 간의 통신, 그리고 모든 토큰 전송은 반드시 TLS를 통해서만 이루어져야 한다. 또한, 클라이언트가 특정 범위만 요청할 수 있도록 권한 범위를 최소화하는 원칙을 적용하고, 의심스러운 토큰 사용 패턴을 모니터링하는 로깅 및 감사 체계를 구축하는 것이 장기적인 보안에 필수적이다.

7. 실제 구현 및 라이브러리

주요 프로그래밍 언어는 JWT 생성/검증 및 OAuth 2.0 클라이언트/서버 구현을 지원하는 다양한 라이브러리를 제공한다. 이러한 라이브러리는 암호화 서명, 표준 클레임 처리, 인증 서버와의 통신 흐름 관리와 같은 복잡한 작업을 추상화하여 개발자가 핵심 비즈니스 로직에 집중할 수 있게 돕는다.

언어

주요 JWT 라이브러리

주요 OAuth 2.0 라이브러리

JavaScript/Node.js

jsonwebtoken, jose

openid-client, passport-oauth2, simple-oauth2

Python

PyJWT, python-jose

authlib, requests-oauthlib

Java

jjwt, nimbus-jose-jwt

spring-security-oauth2-client, ScribeJava

C# (.NET)

System.IdentityModel.Tokens.Jwt

OpenIddict, IdentityServer4 (커뮤니티 버전), Microsoft.AspNetCore.Authentication.OAuth

Go

golang-jwt/jwt, lestrrat-go/jwx

golang.org/x/oauth2, ory/fosite (서버 구현용)

간단한 구현 예시로, Node.js 환경에서 jsonwebtoken 라이브러리를 사용하여 JWT를 생성하고 검증하는 기본 흐름은 다음과 같다. 먼저 비밀키를 사용해 사용자 정보를 페이로드에 담아 토큰을 서명한다. 이후 클라이언트가 이 토큰을 Authorization 헤더에 담아 API 요청을 보내면, 서버는 동일한 비밀키로 서명을 검증하고 페이로드의 정보를 신뢰하여 사용자를 식별한다.

OAuth 2.0의 권한 부여 코드 승인 방식 구현 흐름에서는 클라이언트 라이브러리가 핵심 역할을 수행한다. 클라이언트는 라이브러리를 사용해 사용자를 인증 서버의 승인 페이지로 리다이렉트한다. 사용자 승인 후 인증 서버가 발급한 인가 코드를 받으면, 라이브러리는 이 코드를 사용해 백채널 통신으로 액세스 토큰을 교환한다. 최종적으로 이 액세스 토큰으로 리소스 서버의 보호된 API에 접근한다.

7.1. 주요 프로그래밍 언어별 JWT/OAuth 2.0 라이브러리

다양한 프로그래밍 언어와 프레임워크는 JWT 생성/검증 및 OAuth 2.0 클라이언트/서버 구현을 지원하는 공식 및 서드파티 라이브러리를 제공한다. 이러한 라이브러리는 암호화 서명, 표준 준수 흐름 처리와 같은 복잡한 저수준 작업을 추상화하여 개발자가 보안 인증 로직에 집중할 수 있게 돕는다.

주요 언어별 대표적인 라이브러리는 다음과 같다.

언어 / 플랫폼

JWT 라이브러리 예시

OAuth 2.0 라이브러리 예시

JavaScript / Node.js

jsonwebtoken, jose

Passport.js, oauth2-server, openid-client

Python

PyJWT, python-jose

Authlib, OAuthLib, django-oauth-toolkit

Java

jjwt, java-jwt, nimbus-jose-jwt

Spring Security OAuth2, pac4j, nimbus-oauth2-oidc-sdk

C# / .NET

System.IdentityModel.Tokens.Jwt

OpenIddict, IdentityServer4 (커뮤니티 유지), Microsoft.AspNetCore.Authentication

Go

golang-jwt/jwt, jwx

golang.org/x/oauth2, ory/fosite

Ruby

jwt, ruby-jwt

doorkeeper, omniauth-oauth2

PHP

firebase/php-jwt, lcobucci/jwt

league/oauth2-server, thephpleague/oauth2-client

라이브러리 선택 시 지원하는 JWA 알고리즘 범위, OAuth 2.0 권한 부여 유형의 구현 완성도, 문서화 상태, 커뮤니티 활성도 및 최근 업데이트 빈도를 고려하는 것이 좋다. 특히 OAuth 2.0 서버 측 구현의 경우 OpenID Connect 확장을 함께 지원하는 라이브러리가 현대적 애플리케이션에 더 적합하다. 대부분의 라이브러리는 공식 RFC 7519 및 RFC 6749 표준을 준수하며, 보안 취약점 패치에 대한 신속한 대응 여부도 중요한 평가 기준이 된다.

7.2. 간단한 구현 예시 흐름

구현 예시는 클라이언트 사이드가 리소스 서버의 보호된 데이터에 접근하는 일반적인 시나리오를 가정한다. 여기서는 권한 부여 코드 승인 방식(Authorization Code Grant)과 JWT를 액세스 토큰으로 사용하는 흐름을 설명한다.

클라이언트 애플리케이션은 먼저 사용자를 인증 서버의 로그인 페이지로 리다이렉트한다. 사용자가 성공적으로 로그인하고 접근 권한을 승인하면, 인증 서버는 미리 등록된 리다이렉트 URI로 권한 부여 코드를 발급한다. 클라이언트는 이 코드와 자신의 클라이언트 비밀키를 사용하여 인증 서버의 토큰 엔드포인트에 요청을 보내고, 응답으로 JWT 형식의 액세스 토큰과 리프레시 토큰을 받는다.

단계

행위자

행동

결과/전송 데이터

1

사용자/클라이언트

리소스 접근 시도

인증 서버 로그인 페이지로 리다이렉트

2

사용자

인증 서버에서 로그인 및 권한 승인

권한 부여 코드 발급

3

클라이언트

권한 부여 코드를 인증 서버의 토큰 엔드포인트로 전송

JWT 액세스 토큰 및 리프레시 토큰 수신

4

클라이언트

액세스 토큰(JWT)을 Authorization 헤더에 담아 리소스 서버에 API 요청

보호된 리소스 데이터 수신

5

리소스 서버

토큰 서명 검증 및 페이로드 클레임 확인[4]

요청 처리 또는 거부

클라이언트는 획득한 JWT를 이후 모든 보호된 API 요청의 Authorization: Bearer <토큰> 헤더에 포함시킨다. 리소스 서버는 별도로 인증 서버에 문의하지 않고도 JWT의 디지털 서명을 검증하여 토큰의 유효성과 발행자를 확인할 수 있다. 토큰이 만료되면 클라이언트는 저장해둔 리프레시 토큰을 사용하여 새로운 액세스 토큰을 자동으로 발급받을 수 있다. 이 흐름은 싱글 페이지 애플리케이션, 모바일 앱, 서버 측 웹 애플리케이션 등에 적용 가능한 기본 패턴이다.

8. 관련 기술 및 확장

OpenID Connect(OIDC)는 OAuth 2.0 프레임워크 위에 구축된 인증 레이어이다. OAuth 2.0이 인가(권한 부여)에 초점을 맞춘 반면, OIDC는 사용자가 누구인지 확인하는 표준화된 방법을 제공한다. 이를 위해 id_token이라는 JWT 형식의 토큰을 도입하여, 클라이언트가 사용자의 신원 정보(이메일, 이름 등)를 안전하게 얻을 수 있게 한다. OIDC는 단순한 인증을 넘어서 싱글 사인온(SSO)과 연합 신원 관리의 기반이 된다.

API Gateway는 마이크로서비스 아키텍처에서 JWT와 OAuth 2.0을 효과적으로 활용하는 핵심 컴포넌트이다. 게이트웨이는 모든 들어오는 API 요청의 중앙 집중식 진입점 역할을 하며, 여기서 인증과 인가를 처리한다. 일반적인 연동 패턴은 클라이언트가 요청과 함께 액세스 토큰(주로 JWT 형태)을 전송하면, API Gateway가 해당 토큰의 서명을 검증하고 필요한 권한(스코프)을 확인한 후, 백엔드 서비스로 요청을 라우팅하는 것이다.

이러한 조합은 몇 가지 중요한 이점을 제공한다. 첫째, 각 개별 마이크로서비스는 인증/인가 로직을 중복 구현할 필요가 없어지고, 비즈니스 로직에만 집중할 수 있다. 둘째, 토큰 검증과 정책 적용을 한 곳에서 관리함으로써 보안 정책의 일관성과 통제력을 높인다. 셋째, 게이트웨이 수준에서 토큰 변환이나 토큰 증명을 수행하여, 백엔드 서비스에 더 구체적이거나 표준화된 클레임을 담은 JWT를 전달할 수 있다.

기술

주요 목적

핵심 산출물

OAuth 2.0과의 관계

OpenID Connect (OIDC)

사용자 신원 인증 및 프로필 정보 제공

id_token (JWT)

OAuth 2.0을 확장한 프로토콜

API Gateway

요청 라우팅, 구성 관리, 보안 정책 집행

정책에 따른 요청 필터링/차단

OAuth 2.0 액세스 토큰을 이용한 인가 수행

이러한 확장 기술들은 현대 애플리케이션 보안 아키텍처에서 JWT와 OAuth 2.0을 더욱 강력하고 유연하게 만드는 필수적인 요소이다.

8.1. OpenID Connect(OIDC) 소개

OpenID Connect(OIDC)는 OAuth 2.0 프레임워크 위에 구축된 인증 계층이다. OAuth 2.0이 인가(권한 부여)에 초점을 맞춘 반면, OIDC는 사용자가 누구인지 확인하는 표준화된 인증 방법을 제공하는 것이 핵심 목적이다. 간단히 말해, OAuth 2.0은 "이 앱이 내 정보에 접근할 수 있는 권한을 부여한다"는 데 사용되고, OIDC는 "이 앱에 내가 누구인지 증명한다"는 데 사용된다.

OIDC의 핵심은 ID 토큰이다. 이 토큰은 JWT 형식으로 발행되며, 사용자의 신원 정보(클레임)를 안전하게 전달한다. ID 토큰에는 일반적으로 발행자(iss), 대상자(aud), 만료 시간(exp)과 함께 사용자의 고유 식별자(sub), 이메일, 이름 등의 정보가 포함된다. 클라이언트는 이 토큰의 서명을 검증하여 발행자를 신뢰하고, 내부 정보를 해석하여 사용자를 인증한다.

OIDC는 몇 가지 표준 엔드포인트와 발견 메커니즘을 정의하여 상호운용성을 높인다. 인가 서버는 /.well-known/openid-configuration 엔드포인트를 통해 자신이 지원하는 설정(발행자 정보, 엔드포인트 URL 목록, 지원하는 알고리즘 등)을 JSON 형식으로 제공한다. 이를 통해 클라이언트는 서버의 기능을 동적으로 발견하고 구성할 수 있다.

OAuth 2.0과 OIDC의 관계는 다음 표로 정리할 수 있다.

측면

OAuth 2.0

OpenID Connect

주요 목적

인가(리소스 접근 권한 위임)

인증(사용자 신원 확인)

주요 토큰

액세스 토큰

ID 토큰 (JWT 형식)

반환 정보

권한 스코프

사용자 신원 정보(클레임)

표준 사용자 정보 엔드포인트

정의되지 않음

UserInfo 엔드포인트로 표준화됨

OIDC는 소셜 로그인, 엔터프라이즈 싱글 사인온(SSO) 등 다양한 시나리오에서 사용자 인증의 표준으로 자리 잡았다. 액세스 토큰으로 리소스 서버에 접근 권한을 부여하는 OAuth 2.0의 기능을 그대로 유지하면서, 표준화된 방식으로 사용자 신원을 확인할 수 있게 해준다.

8.2. API Gateway와의 연동

API 게이트웨이는 클라이언트와 백엔드 마이크로서비스 사이에 위치한 단일 진입점으로, 라우팅, 로드 밸런싱, 모니터링 등의 기능을 제공한다. 인증 및 인가 메커니즘과의 연동은 API 게이트웨이의 핵심 기능 중 하나이다. 게이트웨이 수준에서 JWT 또는 OAuth 2.0 액세스 토큰을 검증함으로써, 개별 서비스들이 인증 로직을 중복 구현할 필요가 없어지고 보안 정책을 일관되게 적용할 수 있다.

일반적인 연동 패턴은 다음과 같다. 클라이언트가 API를 호출할 때 HTTP 요청의 Authorization 헤더에 Bearer 토큰을 담아 전송한다. API 게이트웨이는 이 요청을 가로채 토큰의 서명을 검증하고, 필요한 경우 토큰 내부 클레임을 확인하여 인가 정책을 적용한다. 유효하지 않거나 권한이 없는 토큰에 대해서는 게이트웨이 단계에서 401 Unauthorized 또는 403 Forbidden 응답을 즉시 반환하여 백엔드 서비스로의 불필요한 트래픽을 차단한다. 검증이 완료된 토큰의 페이로드 정보는 종종 X-User-Claims와 같은 사용자 정의 헤더로 변환되어 다운스트림 서비스로 전달된다.

이러한 아키텍처는 몇 가지 명확한 장점을 제공한다. 첫째, 보안 관심사가 게이트웨이에 집중되어 백엔드 서비스는 순수한 비즈니스 로직에만 집중할 수 있다. 둘째, 토큰 검증과 같은 무거운 연산을 한 곳에서 처리함으로써 시스템 전체의 성능 효율성을 높일 수 있다. 셋째, 새로운 서비스가 추가되더라도 게이트웨이의 정책 설정만으로 일관된 인증/인가를 보장할 수 있어 확장성이 뛰어나다.

연동 방식

설명

주요 고려사항

토큰 검증(Validation)

게이트웨이가 JWT 서명을 검증하고 유효기간, 대상자(aud) 등을 확인한다.

서명 검증을 위한 공개키 또는 비밀키를 게이트웨이가 안전하게 관리해야 한다.

인가 정책 적용(Authorization)

토큰의 스코프(scope)나 역할(role) 클레임을 기반으로 특정 API 경로나 메서드에 대한 접근을 제어한다.

세분화된 접근 제어 규칙(RBAC 등)을 게이트웨이 설정에 정의해야 한다.

클레임 전파(Claim Propagation)

검증된 토큰의 페이로드 정보를 추출해 헤더 형태로 백엔드 서비스에 전달한다.

민감한 사용자 정보가 노출되지 않도록 전달할 클레임을 신중히 선택해야 한다.

그러나 주의할 점도 존재한다. 게이트웨이가 단일 장애점이 될 수 있으며, 게이트웨이 구성이 복잡해질수록 관리 부담이 증가한다. 또한, 매우 세분화된 사용자 단위의 인가는 여전히 개별 서비스 내부에서 처리해야 할 수 있다. API 게이트웨이를 OAuth 2.0의 리소스 서버 역할로 구성하거나, 토큰 교환을 통해 내부 서비스 간 통신에 사용할 전용 토큰을 발급하는 고급 패턴으로 활용하기도 한다.

9. 여담 및 참고 자료

  • Wikipedia - JSON Web Token

  • Wikipedia - OAuth

  • IETF - RFC 7519: JSON Web Token (JWT)

  • IETF - RFC 6749: The OAuth 2.0 Authorization Framework

  • OAuth 공식 사이트

  • JWT.io

  • MDN Web Docs - OAuth 2.0

  • Auth0 - JWT Handbook

  • Google Identity - OAuth 2.0

리비전 정보

버전r1
수정일2026.02.13 22:19
편집자unisquads
편집 요약AI 자동 생성
히스토리로 돌아가기