본문 바로가기
프로그래밍/Open API

[Open API] #3. API 인증과 보안

by HI_Ai 2024. 1. 5.
반응형

디지털 세상에서 API(애플리케이션 프로그래밍 인터페이스)는 소프트웨어 통신과 상호 작용의 중추가 되었습니다. 다양한 기능과 데이터의 관문인 API는 권한이 부여된 사용자와 애플리케이션만 액세스할 수 있도록 하는 강력한 메커니즘이 필요합니다. 바로 이 점이 API 인증이 필요한 이유입니다. 이는 무단 액세스로부터 민감한 데이터와 서비스를 보호하는 첫 번째 방어선 역할을 합니다. API 인증은 데이터 무결성을 유지하고, 개인정보를 보호하며, 사용자 신뢰를 유지하는 데 도움이 되므로 그 중요성은 아무리 강조해도 지나치지 않습니다.

API 인증의 기본 원칙
API 인증은 기본적으로 API에 액세스하려는 사용자 또는 시스템의 신원을 확인하는 것입니다. 핵심 원칙은 다음과 같습니다:
1. 식별: 사용자 또는 엔티티가 누구인지 확인합니다.
2. 검증: 비밀번호, 토큰, 생체 데이터 등 다양한 수단을 통해 신원을 확인합니다.
3. 승인(구별되지만 관련 있음): 신원 확인이 완료되면 사용자가 액세스할 수 있는 리소스와 수행할 수 있는 작업을 결정합니다.

API 인증의 과제
API 인증을 구현하는 과정에서 개발자는 몇 가지 문제에 직면하게 됩니다:
1. 보안 위험: 인증 방법이 취약하면 데이터 유출을 비롯한 다양한 보안 취약점에 API가 노출될 수 있습니다.
2. 사용자 경험: 강력한 보안과 원활한 사용자 경험 사이의 균형을 맞추는 것은 종종 어려운 일입니다.
3. 확장성: 사용자 수가 증가함에 따라 인증 메커니즘은 성능 저하 없이 그에 맞게 확장되어야 합니다.
4. 규정 준수 및 규제: 인증 메커니즘을 구현하는 동안 GDPR 또는 HIPAA와 같은 다양한 데이터 보호 및 개인정보 보호법을 준수해야 합니다.

결론적으로 API 인증은 최신 웹 및 모바일 애플리케이션의 핵심 구성 요소입니다. 인증된 사용자 또는 시스템만 API에 액세스할 수 있도록 하여 민감한 데이터와 기능이 오용되지 않도록 보호합니다. 데이터가 중요한 자산이 되는 시대로 접어들면서 모든 조직에서 API 인증에 대한 확실한 이해와 구현은 필수 불가결한 요소가 되었습니다.


기본 인증 유형

 

1. HTTP 기본 인증이란?
   - HTTP 기본 인증은 HTTP 프로토콜에 내장된 간단한 인증 체계입니다.
   - 이 방식은 HTTP 헤더의 표준 필드를 사용하여 클라이언트가 Base64로 인코딩된 사용자 이름과 비밀번호를 전송합니다.

2. 작동 방식
   - 클라이언트는 '기본' 키워드와 공백, Base64로 인코딩된 문자열 '사용자 이름:비밀번호'가 포함된 '권한 부여' 헤더로 요청을 보냅니다.
   - 예를 들어 사용자 이름이 'admin'이고 비밀번호가 'password'인 경우 인코딩된 헤더는 'Authorization'이 됩니다: Basic YWRtaW46cGFzc3dvcmQ=`가 됩니다.

3. 보안 고려 사항
   - 가장 큰 단점은 Base64가 암호화가 아니라 단지 인코딩에 불과하다는 것입니다. 자격 증명을 가로챌 경우 쉽게 디코딩할 수 있습니다.
   - 전송된 데이터를 보호하려면 HTTPS를 사용하는 것이 중요합니다.
   - 추가 보안 계층이 마련되어 있는 내부 또는 덜 민감한 애플리케이션에 가장 적합합니다.



1. API 키란?
   - API 키는 API 서버에서 클라이언트를 인증하는 데 사용되는 고유 식별자입니다.
   - 액세스를 제어하고, API 사용을 모니터링하고, 호출 애플리케이션을 식별하는 간단한 방법입니다.

2. API 키 사용
   - 클라이언트는 요청 헤더 또는 쿼리 파라미터에 API 키를 포함합니다.
   - 서버는 알려진 키와 비교하여 키의 유효성을 검사하고 유효성에 따라 요청을 허용하거나 거부합니다.

3. 보안 측면
   - API 키는 기본 사용자 이름-비밀번호 쌍보다 더 안전하지만, 안전하게 처리하지 않으면 여전히 손상될 수 있습니다.
   - API 키는 HTTPS를 통해 전송하고 클라이언트 측에 안전하게 저장해야 합니다.
   - 키 노출의 잠재적 위험 때문에 보안 수준이 높은 애플리케이션에는 권장되지 않습니다.

요약하면, HTTP 기본 인증과 API 키는 모두 API 액세스를 보호하는 방법을 제공하지만 각기 장단점이 있습니다. HTTP 기본 인증은 구현하기 쉽지만 보안성이 떨어지므로 내부 또는 위험도가 낮은 애플리케이션에 적합합니다. 약간 더 나은 보안을 제공하는 API 키는 특히 퍼블릭 API에서 API 사용을 제어하고 모니터링하는 데 일반적으로 사용됩니다. 그러나 두 가지 방법 모두 신중하게 사용해야 하며, 특히 민감한 데이터나 트랜잭션을 처리할 때는 다른 보안 조치와 함께 사용해야 합니다.


기본 인증 구현하기

서버 측 구현 단계
1. 인증 요구 사항 설정
   - 특정 엔드포인트에 액세스하기 위해 기본 인증을 요구하도록 서버를 구성합니다.
   - 여기에는 수신 요청에 권한 부여 헤더가 있는지 확인하는 로직을 설정하는 것이 포함됩니다.
2. 수신 요청 처리
   - 요청이 수신되면 서버는 'Authorization' 헤더를 찾습니다.
   - 헤더가 없는 경우 서버는 401 권한 없음 상태로 응답하여 클라이언트에게 자격 증명을 제공하라는 메시지를 표시합니다.
3. 자격 증명 디코딩 및 확인
   - 서버는 'Authorization' 헤더에서 Base64로 인코딩된 자격 증명을 디코딩합니다.
   - 그런 다음 디코딩된 사용자 이름과 비밀번호를 사용자 데이터베이스 또는 자격 증명 저장소와 비교하여 확인합니다.
4. 액세스 권한 부여 또는 거부
   - 자격 증명이 유효하면 서버가 요청을 처리하고 원하는 응답을 반환합니다.
   - 자격 증명이 유효하지 않으면 요청이 거부되며, 일반적으로 401 권한 없음 상태가 표시됩니다.

클라이언트 측 구현 단계
1. 자격 증명 인코딩
   - 클라이언트는 사용자 이름과 비밀번호를 콜론(사용자 이름:비밀번호)으로 연결하여 사용자 이름과 비밀번호를 준비한 다음 이 문자열을 Base64로 인코딩합니다.
2. 요청에 자격 증명 포함
   - 인코딩된 자격 증명은 HTTP 요청 헤더에 'Authorization'으로 추가됩니다: 기본 [encoded_credentials]'로 추가됩니다.
   - 이 헤더는 서버로 전송되는 모든 API 요청에 포함됩니다.
3. 서버 응답 처리
   - 클라이언트는 서버의 응답을 확인합니다. 401 권한이 없는 상태인 경우, 클라이언트는 사용자에게 자격 증명을 다시 입력하라는 메시지를 표시할 수 있습니다.
   - 인증에 성공하면 API 요청이 완료됩니다.

보안 영향 및 모범 사례
1. HTTPS 사용
   - Base64로 인코딩된 자격 증명을 가로챌 경우 쉽게 해독할 수 있으므로 데이터 전송을 암호화할 때는 항상 HTTPS를 사용하세요.
2. 자격증명 보호
   - 클라이언트 측에서는 자격 증명을 안전하게 저장하고 하드코딩하거나 노출하지 않아야 합니다.
   - 서버 측에서는 해싱 및 솔팅과 같은 기술을 사용하여 자격 증명을 안전하게 저장해야 합니다.
3. 기본 인증의 제한 사항
   - 기본 인증은 가장 안전한 방법이 아니며 매우 민감한 데이터에 사용해서는 안 된다는 점을 인식하세요.
   - 보안을 강화하기 위해 추가 보안 계층 또는 더 강력한 인증 방법을 고려하세요.
요약하자면, 기본 인증을 구현하려면 권한이 있는 사용자만 API에 액세스할 수 있도록 서버와 클라이언트 양쪽에서 특정 단계를 수행해야 합니다. 기본 인증은 비교적 쉽게 구현할 수 있지만, 보안 한계를 이해하고 항상 HTTPS의 보호 아래 적절한 시나리오에서 사용하는 것이 중요합니다.


OAuth 이해

1. 정의 및 목적
   - OAuth는 타사 애플리케이션이 HTTP 서비스에 대한 제한된 액세스 권한을 얻을 수 있도록 하는 인증 프레임워크입니다.
   - 이를 통해 사용자는 비밀번호를 노출하지 않고도 웹사이트나 애플리케이션이 다른 웹 서비스에서 자신의 정보에 액세스할 수 있도록 허용할 수 있습니다.

2. OAuth 사용
   - 다양한 웹사이트와 앱의 'Google로 로그인' 또는 'Facebook으로 인증' 버튼에서 흔히 볼 수 있습니다.
   - 사용자는 다른 사이트에 대한 로그인 자격 증명을 공유하지 않고 다른 사이트의 일부 정보(예: 프로필 정보, 연락처 등)에 대한 웹사이트 액세스 권한을 부여합니다.

3. 주요 구성 요소
   - 리소스 소유자: 데이터를 소유하거나 데이터에 대한 액세스 권한을 부여할 수 있는 권한을 가진 사용자.
   - 클라이언트: 액세스를 요청하는 애플리케이션(웹사이트 또는 앱)입니다.
   - 인증 서버: 리소스 소유자를 인증하고 클라이언트에 액세스 토큰을 발급하는 서버입니다.
   - 리소스 서버: 사용자 데이터를 호스팅하고 액세스 토큰을 사용하여 보호된 리소스 요청을 수락하고 응답할 수 있는 서버입니다.


OAuth 2.0: 최신 표준

1. OAuth 2.0으로의 진화
   - OAuth 2.0은 인증에 대한 업계 표준 프로토콜로, 클라이언트 개발자의 단순성과 특정 인증 흐름에 중점을 두고 있습니다.
   - OAuth 1.0과 역호환되지 않습니다.
2. 주요 개선 사항
   - 다양한 유형의 애플리케이션(웹, 모바일, 서버 측 등)에 대응할 수 있도록 여러 인증 흐름으로 유연성이 향상되었습니다.
   - 특히 디지털 서명이 필요하지 않은 사용자를 위한 간소화된 클라이언트 경험.
3. 일반적인 OAuth 2.0 플로우
   - 인증 코드: 클라이언트 비밀을 안전하게 저장할 수 있고 리디렉션을 사용할 수 있는 앱용.
   - 암시적: 토큰이 직접 반환되는 브라우저 기반 또는 모바일 앱용.
   - 비밀번호 자격 증명: 서비스 자체에서 소유한 클라이언트와 같이 신뢰할 수 있는 클라이언트용입니다.
   - 클라이언트 자격 증명: 클라이언트 자체 리소스에 대한 액세스용.
4. 보안 및 사용
   - 수명이 짧은 액세스 토큰을 인증에 사용하므로 토큰이 손상될 경우의 위험이 줄어듭니다.
   - 안전한 데이터 전송을 위해 HTTPS를 사용합니다.

요약하자면, OAuth는 사용자 자격 증명을 노출하지 않고도 타사 애플리케이션이 사용자 데이터에 액세스할 수 있도록 인증하는 안전하고 사용자 친화적인 방법을 제공합니다. 유연성과 사용 편의성을 갖춘 OAuth 2.0은 최신 웹 및 모바일 애플리케이션의 표준으로 자리 잡았으며, 사용자 데이터에 대한 안전한 액세스가 필요한 다양한 시나리오에서 사용할 수 있습니다.

 


토큰기반 인증 및 JWT

1. 토큰의 역할
   - 토큰은 애플리케이션에서 사용자 또는 시스템을 인증하고 권한을 부여하는 안전한 방법입니다.
   - 사용자 이름 및 비밀번호와 같은 기존 방법과 달리 토큰은 보다 안전하고 유연하게 액세스를 제어할 수 있는 방법을 제공합니다.

2. 토큰 기반 인증의 작동 방식
   - 로그인에 성공하면 서버는 사용자의 신원과 권한을 캡슐화한 토큰을 생성합니다.
   - 클라이언트는 후속 요청 시 이 토큰을 HTTP 헤더로 전송하여 서버가 매번 사용자 이름과 비밀번호를 요구하지 않고도 사용자의 신원과 권한을 확인할 수 있도록 합니다.

3. 토큰의 장점
   - 보안: 토큰은 암호화 및 서명할 수 있어 안전하고 위변조가 불가능합니다.
   - 상태 비저장성: 서버가 세션 상태를 유지할 필요가 없으므로 시스템 확장성이 뛰어납니다.
   - 유연성: 토큰은 다양한 도메인과 서비스에서 사용할 수 있어 싱글 사인온(SSO) 및 분산 시스템에 적합합니다.



1. JWT의 이해
   - JWT는 두 당사자 간에 전송할 클레임을 표현하는 간결하고 URL에 안전한 방식입니다. 
   - 일반적으로 안전한 정보 교환을 위해 사용되며, 인증과 관련하여 사용자 세션을 관리하는 방법으로 사용됩니다.

2. JWT의 구조
   - 헤더: 토큰 유형 및 서명에 사용된 알고리즘과 같은 토큰에 대한 메타데이터를 포함합니다.
   - 페이로드: 엔티티(사용자) 및 추가 데이터에 대한 진술인 클레임이 포함됩니다.
   - 서명: 토큰의 무결성을 보장하고 토큰이 변경되지 않았음을 확인합니다.

3. 인증에 JWT 사용
   - 인증 시 서버는 JWT를 생성하여 클라이언트에 보냅니다.
   - 클라이언트는 HTTP 요청의 권한 부여 헤더에 이 JWT를 보냅니다.
   - 서버는 JWT의 유효성을 검사하고 유효성에 따라 액세스 권한을 부여합니다.

4. JWT의 장점.
   - 독립형: 필요한 모든 사용자 정보가 토큰에 인코딩되어 있어 데이터베이스를 쿼리할 필요성이 줄어듭니다.
   - 효율성: 클라이언트-서버 통신에서 원활한 데이터 교환을 촉진합니다.
   - 교차 도메인 액세스: 단일 페이지 애플리케이션(SPA) 및 마이크로서비스 아키텍처에 이상적입니다.

5. JWT를 사용한 보안 사례
   - HTTPS를 사용하여 토큰 가로채기를 방지하세요.
   - 토큰 만료 및 새로 고침 메커니즘을 구현하세요.
   - 페이로드 데이터를 최소한으로 유지하여 토큰 크기를 줄입니다.

 

요약하자면, 토큰 기반 인증, 특히 JWT를 사용하는 토큰 기반 인증은 최신 애플리케이션에서 사용자 세션을 관리하는 효율적이고 안전한 방법을 제공합니다. JWT는 컴팩트하고 독립적인 형식이므로 확장성과 성능이 중요한 분산 시스템 및 애플리케이션에 이상적인 선택입니다.

반응형