1. Client 인증
Authorization Server는 클라이언트 인증을 위한 자격증명(client_id, client_secret)을 설정
Authorization Server는 Client pw보다 강력한 인증수단 사용 권장 (mTLS, JWT)
발급받은 client_secret은 기밀성을 반드시 보장해야 함
Authorization Server는 Native Application(.apk, .ipa 등)와 같이 사용자가 직접 실행하는 Application에 기밀성이 요구되는 정보를 발급하지 않아야 함 (리버스 엔지니어링을 통해 유출 가능)
특정 장치에만 바인딩되는 동적 기밀정보는 특정 상황에 한해 발급 가능하나, 권장하지 않음
Client 인증이 불가능한 경우(안전한 기밀정보의 보관이 불가능한 Client) 대체 수단을 사용해야 함
대체 수단으론 redirect_uri, Resource Owner의 확인 등이 존재
redirect_uri 만으론 신원 확인을 보장해선 안됨 (피싱 앱 등의 우려로 인해)
Authorization Server는 인증되지 않은 Client와 상호작용할 때 발생가능한 모든 보안영향을 고려하고, 해당 클라이언트에 발급된 다른 자격증명 노출 위험을 최소화 해야함
2. Client 사칭
Client의 자격증명이 유출될 경우 사칭 위험이 큼
Authorization Server는 가능한 모든 상황에서 Client를 인증해야 함
Client 인증이 불가한 경우 Redirect URI를 사전에 등록하도록 요구해야 하며, 추가적인 방어 수단을 활용해야 함
Authorization Server는 명시적인 Resource Owner 인증 절차를 적용하고, Resource Owner에게 scope와 lifetime에 대한 세부 정보를 제공해야 함
Resource Owner는 상기한 정보를 검토 후, 승인 혹은 거부할 책임이 존재
Authorization Server는 Client를 인증하지 않거나 타 방어 수단을 통해 요청을 검증하지 않는 한 Resource Owner의 적극적인 상호작용 없이 반복된 인가 요청을 자동으로 처리해선 안됨
3. Access Token
Access Token Credentials은 전송 및 저장 시 기밀로 유지되어야 하며 Authorization Server, Access Token이 유효한 Resource Server, Access Token이 발급된 Client Server 간에만 공유되어야 함
Access Token Credentials은 [RFC 2818]에 정의된 서버 인증을 사용한 TLS를 통해야만 함
Implicit Grant 유형을 사용할 때 Access Token이 URI fragment에 전송되어 노출 우려 존재
Authorization Server는 무단 제3자가 유효한 Access Token을 생성, 변경, 추측하여 획득하지 못하도록 보장해야 함
Client는 최소한의 scope만 요청해야 함
서버는 Client의 정체를 고려해야 하며, 요청된 권한보다 적은 권한을 발급 가능
RFC 2818 : TLS 핸드셰이크 중 제시되는 서버 인증서 검증 절차
4. Refresh Token
Authorization Server는 Web Application Client & Native Application Client에게 Refresh Token 발급 가능
Refresh Token은 전송 및 저장 시 기밀을 유지해야 하며 Authorization Server와 Refresh Token이 발급된 Client 간에만 공유되어야 함
Refresh Token은 Client에 바인딩 되어 특정 Client에만 유효하도록 설계되어야 함
Resource Owner, 타 Client에 노출되어선 안되기에 [RFC2818] 섹션 1.6에 설명된 TLS 등의 전송 보안이 필요
Client 인증 불가 시, Authorization Server는 Refresh Token 남용을 탐지하기 위한 수단 배포 필요. Refresh Token Rotation, 일회용 토큰 등
Refresh Token Rotation: Refresh Token을 사용한 즉시 Access Token 발급과 함께 기존 토큰 파기
5. Authorization Code
Client와 Authorization Server간 교환되어 Access Token을 얻는데에 사용
Authorization Code의 전송은 보안 채널을 통해 이루어져야 함
Client가 네트워크 리소스를 식별하는 경우 Redirect URI에 TLS 사용을 요구해야 함
Authorization Code는 User-Agent Redirection을 통해 전송되므로 잠재적인 노출 가능성 존재
Authorization Code는 plaintext bearer credentials로 작동하며 Authorization Server에서 권한을 부여한 Resource Owner가 프로세스를 완료하기 위해 Client로 돌아오는 동일한 Resource Owner인지 확인 함
Client가 자체 Resource Owner 인증을 위해 Authorization Code에 의존하는 경우 Client Redirection EndPoint는 TLS 사용을 요구해야 함
Authorization Code는 짧은 수명, 단일 사용 조건을 만족해야함
Authorization Server가 Access Token 교환을 위해 Authorization Code에 대한 여러 시도를 관찰 시 해당 코드 기반으로 부여된 모든 Access Token을 파기해야 함
Client를 인증 가능한 경우 Authorization Server는 Client를 인증하고 Authorization Code가 동일한 Client에 발급되었는지 확인해야 함
User-Agent Redirection: OAuth 2.0 흐름에서 인가 서버가 권한 부여 코드나 액세스 토큰을 클라이언트 애플리케이션에 전달하기 위해 사용자의 브라우저(=User Agent)를 특정 URL로 이동시키는 과정
6. Authorization Code Redirection URl 변조 방지
- Authorization Code로 권한 부여를 요청할 때 Client는 redirect_uri 파라미터를 통해 Redirection URI 지정 가능
- 공격자가 redirect_uri 파라미터 조작 가능하다면 인증 서버를 공격자 서버로 유도 가능
- Authorization Server는 권한 부여 코드를 얻는데 사용된 Redirection URI가 Access Token 교환시 제공된 Redirection URI와 동일한지 반드시 확인해야 함
7. Resource Owner PW Credentials(ROPC)
- Client Application에서 Resource Owner가 직접 계정정보를 넘겨 처리하는 것
- Client가 Resource Owner에게 극도로 신뢰받는 경우에만 사용 가능
- Authorization Server는 scope와 수명을 제한하고, 보안을 강화해야 함
- 해당 유형을 가능한 한 최소화하고 다른 유형을 활용해야 함
8. Request 기밀성
Access Token, Refresh Token, Client Credentials등 기밀정보가 포함된 모든 Request는 TLS를 사용하여 전송해야 함
Authorization Code는 가급적 평문 전송을 피하는걸 권장
Client와 Server는 모든 기밀정보에 대한 기밀성과 무결성을 보장해야 함
Client와 Server는 보안이 보장되지 않는 채널의 요청을 거부해야 함
state와 scope 파라미터엔 기밀정보나 Resource Owner 정보를 평문으로 담아선 안됨
상기한 파라미터는 취약한 채널로 전송되거나 안전하지 않게 저장될 수 있음
9. EndPoint 진위 확인
MITM 공격을 방지하기 위해, Authorization Server는 권한 부여 및 토큰 EndPoint로 전송되는 모든 요청에 대해 [RFC2818]에 정의된 서버 인증과 함께 TLS 사용 요구
Client는 [RFC6125]에 정의된 대로, Server의 ID 인증 요구 사항에 따라 Authorization Server의 TLS 인증서를 검증해야 함
10. Credentials-Guessing Attacks
Authorization Server는 공격자가 Access Token, Refresh Token, Authorization Code, Resource Owner Password, Client Credentials를 추측하는 것을 방지해야 함
생성된 토큰을 공격자가 추측할 확률은 2^(-128)보다 작아야 함
생성된 토큰을 공격자가 추측할 확률은 2^(-160)보다 작기를 권고됨
Authorization Server는 최종 사용자의 사용을 위한 Credentials을 보호하기 위해 추가적인 보안조치가 필요함
11. Phishing Attacks
OAuth와 같은 인증 프로토콜이 늘어남에 따라 사용자는 Redirection과 PW를 입력하는 경험에 익숙해짐
매 리다이렉트 순간마다 사용자가 검증하지 않으면 피싱 가능
서비스 제공자는 최종 사용자를 교육하고, 사용자가 사이트를 쉽게 확인 가능한 메커니즘을 제공해야 함
피싱 공격의 위험을 줄이기 위해, Authorization Server는 최종 사용자와의 상호작용에 사용되는 모든 EndPoint에서 TLS 사용이 요구됨
12. CSRF
CSRF 공격이 Client의 Redirection URI에 대해 이루어지면, 공격자의 Authorization Code, Access Token을 주입 가능.
상기한 공격의 결과로 공격자가 제어하는 자원에 피해 사용자 정보를 저장하거나 악의적인 동작 수행 가능
따라서 Client는 Redirection URI에 대한 CSRF 방어를 구현해야 함
Redirection URI로 들어오는 모든 요청에 User-Agent 인증상태와 결합된 값을 포함하도록 요구
- Client의 권한 요청 시 state 파라미터 사용. 콜백 요청 받을 시 state 값을 비교 확인
State 파라미터 전달 예시
https://auth.example.com/authorize?
response_type=code&
client_id=abc123&
redirect_uri=https%3A%2F%2Fclient.example.com%2Fcallback&
state=m5K8zQ1rYn- Authorization Server가 자체 인증 EndPoint에 대한 CSRF 방어를 구현하고, Resource Owner의 인지 및 명시적 동의 없이 Client가 권한을 얻지 못하도록 보장해야 함
Cross-Site Request Forgery(=CSRF): 최종 사용자의 User-Agent가 악의적인 URI를 따라 신뢰된 서버로 요청을 보내도록 유도하는 공격 기법. 이때의 신뢰된 서버는 유효한 세션, 쿠키가 존재해 사용자가 이미 인증된 상태로 간주
13. Clickjacking
Clickjacking 공격이 이루어지면 Resource Owner의 인지나 동의 없이 접근 권한 등을 획득 가능하다.
공격 방지를 위해 Native Application은 권한 부여 요청할 때 Embedded Browser(Software 내 브라우저) 대신 External Browser(OS에 설치된 별도 브라우저) 사용
비표준 헤더인 X-Frame-Options 헤더 설정
- X-Frame-Options: deny
ㄴ 어떤 사이트에서도 frame 허용 금지
- X-Frame-Options: sameorigin
ㄴ 같은 origin의 사이트에서만 frame 허용Clickjacking: 공격자가 iframe 혹은 css를 사용해 정상 페이지 위로 투명한 악성 페이지 구현. 사용자의 클릭을 유도해 공격 수행 가능
Embedded Browser(내부 브라우저): Native Application 내부에 <WebView> 컴포넌트 직접 포함해 웹 페이지 렌더링.
- 보안 UI 없거나 제한적 제공
- 일부 보안 헤더 해석되지 않음
- 호스트 Application 프로세스 내에서 동작. Application 코드, 권한 영향권 내에 제어 조작 위험 존재
External Browser(외부 브라우저): OS가 기본으로 제공하거나 사용자가 설치한 독립 실행형 브라우저 Application
- 브라우저 보안 UI 제공
- 보안 헤더 동작
- Application과 분리된 프로세스. Application 취약점으로부터 세션 격리
14. Code Injection & Input Validation
입력 또는 기타 외부 변수가 Application에 의해 비정상적으로 사용, Application 로직을 수정할 때 발생
공격자가 Application 장치, 데이터에 접근 혹은 Dos 유발 등 광범위한 악성행위 허용
Authorization Server와 Client는 수신된 모든 값, 특히 state 및 redirect_uri 파라미터 값을 sanitize 및 유효성 검사 필요
15. Open Redirectors
Authorization Server, Authorization Endpoint, Client Redirection Endpoint는 부적절하게 구성되어 Open Rediractors로 작동 가능
Open Redirectors는 Phishing Attacks에 사용되거나 최종 사용자를 악성 사이트로 방문 시킬 수 있음
또한 Authorization Server가 Client에게 Redirection URI의 부분 매칭을 허용할 경우 Authorization Code, Access Token 등을 공격자가 제어하는 Endpoint로 전송 가능
Open Redirectors: Web Application이 외부에서 받은 Redirection URL 파라미터를 검증 없이 신뢰하여, 사용자 브라우저를 임의의 외부 사이트로 Redirection 시키는 취약점
16. Implicit Flow에서 Resource Owner 사칭을 위한 Access Token 오용
Implicit Flow을 사용하는 공용 Client의 경우 Access Token을 발급한 Client를 Client 자체적으로 확인할 방법을 제공하지 않음
Resource Owner가 Phising등의 이유로 악성 Client에게 Access Token 부여 혹은 공격자가 다른 수단을 통해 토큰 탈취 가능
공격자는 탈취한 Access Token을 정상적인 공개 Client에 제공함으로써 Resource Owner 사칭 시도 가능
Implicit Flow에선 공격자가 Authorization Server로부터 되돌아오는 응답에서 공격자의 토큰으로 swap 가능
Back Channel로 Access Token을 전달받아 사용자 식별하는 Native Application과 통신하는 Server도 유사하게 위협 가능
Resource Owner만이 자신의 Resource에 대한 Access Token을 제공 가능하다 가정하는 모든 공개 Client는 해당 공격에 취약
상기한 유형의 공격은 Client에서 Resource Owner에 대한 정보를 공격자에게 노출 가능
또한 공격자는 Access Token 또는 Authorization Code를 부여한 Resource Owner와 동일한 권한으로 Client에서 작업 수행 가능
OAuth를 사용자 인증 수단으로 쓰기 위해선 Access Token이 자체 사용을 위해 발급되었는지 Client가 확인 가능한 추가 보안 메커니즘 없이 Implicit Flow를 사용해서는 안됨
Implicit Flow(암시적 흐름): Client Secret을 안전하게 보관 불가능한 환경에서 Authorization Code 단계를 건너뛰고 Access Token을 바로 전달받는 흐름
'Concept' 카테고리의 다른 글
| HRS-CL.CL (2) | 2025.10.10 |
|---|---|
| HRS (1) | 2025.10.10 |
| OAuth 2.0 (0) | 2025.10.10 |
| [JS] 자바스크립트 기본 개념 / DOM (0) | 2025.04.08 |
| [Oracle Cloud] 오라클 클라우드 / 로그인부터 웹 서버 띄우기까지 (0) | 2025.04.01 |