theme | highlighter | lineNumbers | drawings | css | aspectRatio | download | fonts | |||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
eloc |
shiki |
false |
|
unocss |
16/9 |
true |
|
- 인증? 인가?
- 외부 인증 제공자를 통한 인증
- 연관 표준들의 간략한 개요
- 구현 시 주의사항 및 보안 지침
- 알아두면 좋은 토막 지식들
- 인증 "제공자"가 알아야 하는 것들
- 세션 관리 전략
- 리소스 접근 제어 전략
이 주제들로 심도깊은 얘기를 해보고 싶다면 따로 요청할 것
Authentication, AuthN
vs
Authorization, AuthZ
잘 구분 하고 있나요? (Tip: 해야됨)
Authentication → 접근 주체의 신원(Identity) 확인
Authorization → 접근을 승인 또는 거부
예를 들면...
공연장 입장할 때 티켓과 신분증을 보여줌 → 인증
티켓에 할당된 좌석에 착석할 수 있음 → 인가 (승인)
근데 그 티켓 보여줘도 백스테이지는 못들어감 → 인가 (거부)
헷갈리는 이유는 아마...
(일단 입장만 하면 마음대로 다 할 수 있다)
여기서 다루는 내용은 (제공자를 통한) 인증 구현 입니다.
인가에 대해서는 (거의) 다루지 않아요.
컴퓨터가 특정 대상(사람, 사물, 장치 등)을 식별할 수 있도록 기록된 특성 집합
- 대상이 알고 있는 것
- 대상이 소유한 것
- 대상인 것
인증은 신원을 확인하는 절차로 특성 중 하나 이상을 평가함
ex. 니가 Tim 이라고?
- 대상이 알고 있는 것 → 비밀번호 입력해봐
- 대상이 소유한 것 → 내가 방금 tim@daangn.com 으로 보낸 코드가 뭐게?
- 대상인 것 → 여기 지문 찍어봐
인증이 필요한 앱 A, B, C... 다 따로 신원을 관리해야 하나?
한 곳(Identity Provider)에서 관리(DBMS, LDAP)하고 인증을 위임하자!
ID 제공업체 X, Y, Z.... 서비스 제공업체 A, B, C...
Federation은 다양한 파티들이 표준화된 계약을 통해 서로가 알고 있는 Identity를 연결하는 것
(OAuth 2, SAML 2, OpenID Connect, Shibboleth ...)
RFC 6749: The OAuth 2.0 Authorization Framework
"서드파티 서비스"에 리소스에 대한
"제한된 접근"을 위임하기 위한 프로토콜
"Delegated Authority"
- 인증을 위한 도구가 아님
- 인가를 위한 도구도 아님
- Authorization Server (AS)
- Resource Server (RS)
- Resource Owner (RO)
- Client Types
- Confidential Client
- Public Client
- Authorization Code Grant
- Implicit Grant ❌
- Client Credentials Grant
- Resource Owner Password Credentials Grant ❌
- Device Authorization Grant (RFC 8628)
OAuth 2로 인증 구현하기
- AS는 인가 전 자체적으로 사용자를 인증함
- 보호된 리소스(ex.
/users/me
)에 접근할 수 있으면 인증되었음이 자명함
OAuth 2는 Application 등록부터 시작
https://github.com/settings/applications/new
- Homepage
- Redirect URI(s)
- Client ID
- Client Secret
공격자가 인증된 사용자의 세션을 통해 위조된 요청을 전송함
- OAuth 2 자체는 "사용자"에 대한 디테일을 (의도적으로) 전혀 다루지 않음
- 사용자 인증 방식이 표준화 되지 않아 구현이 통일되지 않음
- 비효율적으로 동작함
OpenID 재단에서 주도하는 산업 표준
OAuth 2 기반으로 만든 사용자 인증 프레임워크
- 인증 제공자 메타데이터 제공 방법
- 사용자 정보 교환 방법
- 사용자 세션 관리 방법
- 기타 등등을 표준화
모바일 앱, 웹 기반 SPA와 같은 퍼블릭 클라이언트의 보안 위협을 완화하기 위한 확장 도구
퍼블릭 클라이언트에서는 필수
퍼블릭 클라이언트가 아니더라도, 가능한 경우 모든 Flow에서 사용하는 것을 권장
예시: GitHub App을 만들고 싶은데,
문서보니까 Confidential Client 가이드 밖에 없고 PKCE 지원도 안함.
이렇게 해도 되긴 함...
BFF (Backend for Frontend) pattern is your friend
- OAuth 2.0 Treat Model and Security Considerations (RFC 6819)
- OAuth 2.0 Security Best Current Practice
- OAuth 2.0 for Native Apps (RFC 8252)
- OAuth 2.0 for Browser-Based Apps
- Proof Key Code Exchange (RFC 7636)
- OAuth 2.1
- ForgeRock Identity Series
신원 관리 개념에 대해 쉽게 잘 설명해주는 유튜브 재생 목록 - 아이덴티티 시스템의 7가지 원칙
인증관련 표준들이 모두 공유하는 대원칙을 요약. 전반적인 이해에 도움이 돼요