Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240820 Authorization Grant 본문

개발Article

[TIL]20240820 Authorization Grant

최밤빵 2024. 8. 20. 21:46

🤓Authorization Grant란?

Authorization Grant는 OAuth 2.0 프로토콜에서 사용자가 자신을 대신하여 애플리케이션이 특정 리소스에 접근할 수 있도록 허가하는 메커니즘이다. OAuth 2.0은 사용자 자격 증명을 안전하게 관리하고, 타사 애플리케이션이 사용자의 자원을 안전하게 액세스할 수 있도록 돕는 표준 프로토콜이다. Authorization Grant는 이 프로토콜에서 클라이언트 애플리케이션이 리소스 소유자의 권한을 얻는 방식으로, 여러 가지 Grant Type이 존재한다.

 

▶ OAuth 2.0 개요

OAuth 2.0은 인터넷에서 널리 사용되는 권한 부여 프레임워크로, 사용자가 자신의 자격 증명을 타사 애플리케이션에 노출하지 않고도 자신의 리소스에 접근할 수 있도록 한다. 예를 들어, 사용자가 소셜 미디어 계정으로 다른 애플리케이션에 로그인할 때 OAuth 2.0이 사용된다.

 

OAuth 2.0은 네 가지 역할을 정의한다:

  • Resource Owner (리소스 소유자): 리소스의 소유자이며, 사용자(End-User)를 의미한다.
  • Client (클라이언트): 리소스 소유자를 대신하여 리소스 서버에 요청을 보내는 애플리케이션이다.
  • Authorization Server (인증 서버): 클라이언트를 인증하고 Authorization Grant를 발급하여 토큰을 제공하는 서버이다.
  • Resource Server (리소스 서버): 보호된 자원에 대한 액세스를 제공하는 서버로, 인증 서버에서 발급한 액세스 토큰을 통해 클라이언트를 인증한다.

▶ Authorization Grant의 종류

Authorization Grant는 OAuth 2.0의 핵심 개념으로, 클라이언트가 리소스 소유자의 권한을 얻기 위한 방법을 제공한다. OAuth 2.0은 네 가지 기본 Grant Type을 정의하고 있으며, 각각의 Grant Type은 다양한 사용 사례에 적합하다.

 

→ Authorization Code Grant:

가장 많이 사용되는 Grant Type으로, 클라이언트가 서버 측 애플리케이션일 때 사용된다. 이 방법은 사용자 인증을 위해 클라이언트가 사용자를 인증 서버로 리디렉션하고, 사용자가 인증에 성공하면 인증 서버가 클라이언트에게 Authorization Code를 발급한다. 클라이언트는 이 코드를 다시 인증 서버에 제출하여 Access Token을 발급받는다.

 

→ 장점: 높은 보안 수준을 제공하며, 클라이언트 자격 증명이 노출될 위험이 적다.

 

▽ 예시 : plaintext

1. 사용자가 클라이언트를 통해 인증 서버로 이동한다. 
2. 인증 서버가 사용자에게 로그인 페이지를 제공한다.
3. 사용자가 인증하면, 인증 서버가 클라이언트로 `Authorization Code`를 리디렉션한다.
4. 클라이언트가 인증 서버에 `Authorization Code`를 전송하여 `Access Token`을 요청한다.

Implicit Grant:

주로 SPA(Single Page Application)와 같은 클라이언트 측 애플리케이션에서 사용된다. 이 방법은 Authorization Code를 사용하는 대신, 직접 Access Token을 발급받는다. 사용자가 인증 서버에서 인증을 완료하면 Access Token이 클라이언트로 리디렉션된다.

 

→ 장점: 클라이언트에서 직접 Access Token을 받을 수 있어 구현이 간단하다.

→ 단점: 보안성이 떨어질 수 있으며, 민감한 정보가 URL에 노출될 수 있다.

 

→ Resource Owner Password Credentials Grant:

사용자가 클라이언트 애플리케이션에 자신의 자격 증명(사용자 이름과 비밀번호)을 직접 제공하는 방식이다. 이 방법은 사용자가 클라이언트를 신뢰하는 경우에만 사용해야 한다.

 

→ 장점: 설정이 간단하고, 클라이언트가 인증 서버와 직접 통신할 수 있다.

→ 단점: 사용자 자격 증명이 노출될 위험이 있어 보안성이 떨어진다.

 

▽ 예시 코드:

// 자격 증명으로 Access Token 요청
Map<String, String> params = new HashMap<>();
params.put("grant_type", "password");
params.put("username", "user");
params.put("password", "password");
// 요청과 함께 Access Token을 받음
Response response = restTemplate.postForObject("https://authserver.com/token", params, Response.class);

→ Client Credentials Grant:

서버 간 통신 또는 비사용자 중심 애플리케이션에서 사용된다. 클라이언트가 인증 서버에 직접 자격 증명을 전송하여 Access Token을 받는다. 일반적으로 클라이언트가 자신을 인증하고, 특정 리소스에 접근하기 위해 사용된다.

 

→ 장점: 비사용자 애플리케이션에 적합하고, 클라이언트 자격 증명을 안전하게 관리할 수 있다.

→ 단점: 사용자가 포함되지 않은 단순한 접근 권한 부여에만 적합하다.

 

→ Refresh Token Grant:

Access Token이 만료되었을 때, Refresh Token을 사용하여 새로운 Access Token을 발급받을 수 있다. 이는 사용자가 재인증하지 않고도 지속적인 접근 권한을 유지하도록 돕는다.

→ 장점: Access Token의 짧은 수명으로 보안을 유지하면서, 지속적인 인증이 가능하다.

 

▶ Authorization Grant 사용 시 주의사항

Authorization Grant를 사용할 때는 다음과 같은 주의사항을 고려해야 한다:

 

→ 적절한 Grant Type 선택:

애플리케이션의 유형과 요구사항에 맞는 Grant Type을 선택해야 한다. 보안 수준, 사용자 경험, 구현 복잡도 등을 고려하여 선택해야 한다.

보안 강화:

Access Token과 Refresh Token을 안전하게 저장하고 관리해야 한다. 이를 위해 HTTPS를 사용하고, 토큰을 암호화하거나 안전한 저장소에 보관하는 것이 좋다.

토큰 만료와 갱신 관리:

Access Token은 만료 시간이 설정되어 있으므로, 만료된 토큰을 갱신하는 로직을 구현해야 한다. 이는 사용자의 경험을 향상시키고, 보안성을 유지하는 데 필수적이다.

오용 방지:

Grant Type을 잘못 사용하거나, 비보안 환경에서 자격 증명을 노출시키면, 사용자 데이터와 애플리케이션의 보안이 위험해질 수 있다. 이를 방지하기 위해 철저한 보안 검토와 테스트가 필요하다.

 

▶결론

Authorization Grant는 OAuth 2.0 프로토콜에서 중요한 개념으로, 사용자 인증 및 리소스 접근 제어에 필수적이다. 다양한 Grant Type은 각기 다른 사용 사례와 보안 요구사항에 맞게 설계되어 있으며, 이를 올바르게 이해하고 선택하는 것이 중요하다. 이를 통해 안전하고 효율적인 애플리케이션 개발이 가능해진다.