Foundry
API 설계
기초
핵심

인증과 인가

AuthN vs AuthZ, 누구인지 확인 vs 권한 확인

인증과 인가

차이점

구분인증 (AuthN)인가 (AuthZ)
질문누구인가?뭘 할 수 있는가?
시점로그인 시요청마다
수단ID/PW, OAuth, JWTRBAC, ABAC, ACL

API 인증 방식

방식특징적합 상황
API Key단순, 서비스 간내부 서비스
Bearer TokenJWT 기반웹/모바일 앱
OAuth 2.0위임 인증소셜 로그인, 외부 API

실무 포인트

  • 최소 권한 원칙: 필요한 권한만 부여
  • Access Token + Refresh Token 패턴 권장
  • 면접 빈출: "OAuth 2.0 흐름을 설명해주세요"
면접에서 이렇게 나옵니다

Q.인증(Authentication)과 인가(Authorization) 차이는?

항목인증인가
묻는 것누구인가무엇을 할 수 있는가
순서먼저인증 후
실패 코드401403
로그인, 토큰 검증관리자만 삭제 가능

상태 코드 구분이 실무에서 자주 틀립니다.

상황코드
토큰이 없다401
토큰이 만료됐거나 잘못됐다401
신원은 확인됐지만 권한이 없다403
존재를 숨겨야 하는 자원404

마지막이 판단이 필요한 자리입니다. 남의 문서 id 로 접근했을 때 403 을 주면 그 문서가 존재한다는 사실이 노출됩니다. 민감한 경우에는 404 로 응답해 존재 여부를 숨깁니다.

인가는 자원 단위로 확인해야 합니다. 로그인했다는 것만 확인하고 그 사용자가 그 자원의 소유자인지 검사하지 않으면, id 만 바꿔 남의 데이터를 볼 수 있습니다.

흔한 실수: 인가 검사를 화면에서만 하는 것. 버튼을 숨기는 것은 표시일 뿐이고, API 를 직접 부르면 그대로 통과합니다. 검사는 서버의 각 엔드포인트에서 해야 합니다.

Q.OAuth 2.0 동작 흐름을 설명해주세요

비밀번호를 남에게 주지 않고 제한된 권한만 위임하는 규약입니다.

가장 많이 쓰는 인가 코드 흐름입니다.

순서동작
1사용자가 우리 서비스에서 연동 버튼을 누른다
2제공자의 로그인과 동의 화면으로 보낸다
3사용자가 동의하면 제공자가 우리 콜백 주소로 인가 코드를 준다
4서버가 그 코드와 자기 비밀키로 토큰을 교환한다
5받은 액세스 토큰으로 API 를 호출한다
6만료되면 리프레시 토큰으로 갱신한다

3번과 4번을 나눈 이유가 핵심입니다. 코드는 URL 로 노출되지만 그것만으로는 토큰을 못 얻습니다. 서버의 비밀키가 함께 필요하므로, 브라우저 이력이나 로그에 코드가 남아도 탈취만으로는 쓸 수 없습니다.

등장하는 것역할
자원 소유자사용자
클라이언트우리 서비스
인가 서버동의를 받고 토큰을 발급
자원 서버토큰을 검증하고 데이터를 준다

브라우저나 모바일 앱처럼 비밀키를 숨길 수 없는 곳에서는 PKCE 를 함께 씁니다. 처음에 만든 임의 값의 해시를 보내고 교환 시 원본을 제시해, 코드를 탈취한 쪽이 쓸 수 없게 만듭니다.

흔한 실수: OAuth 를 인증 규약으로 답하는 것. OAuth 2.0 은 인가를 위한 규약이고, 로그인에 쓰려면 그 위에 얹은 OpenID Connect 를 씁니다.

Q.API Key vs JWT vs OAuth 각각 언제 쓰나요?

방식확인하는 것적합한 곳
API 키어느 애플리케이션인가서버 사이 통신, 사용량 측정
JWT어느 사용자인가. 정보를 담아 검증만우리 서비스 안의 사용자 인증
OAuth사용자가 제3자에게 위임한 범위다른 서비스의 데이터에 접근할 때

구분하는 지점은 누가 누구를 대신하는가입니다.

상황선택
우리 배치가 우리 API 를 부른다API 키
우리 앱이 우리 서버에 로그인한다JWT 나 세션
우리 서비스가 사용자의 구글 캘린더를 읽는다OAuth
외부 개발자에게 API 를 공개한다API 키 + 사용량 제한, 또는 OAuth

각자의 약점도 함께 봅니다.

방식약점
API 키유출되면 그대로 쓰인다. 만료가 없어 회전 절차가 필요하다
JWT발급 후 즉시 무효화가 어렵다
OAuth구현이 복잡하고 흐름이 여러 가지다

흔한 실수: JWT 를 API 키처럼 길게 발급하는 것. 무효화가 어려운 방식에 긴 유효 기간을 주면 유출 시 대응할 방법이 없습니다. 짧게 주고 리프레시로 갱신하는 구조가 함께 가야 합니다.

Q.RBAC vs ABAC 차이는?

항목RBACABAC
기준역할속성의 조합
관리자면 삭제 가능같은 부서이고 근무 시간이면 조회 가능
관리역할에 권한을 붙인다. 단순규칙을 정의한다. 유연하다
확인역할 목록만 보면 된다요청 맥락까지 평가해야 한다
문제예외가 생기면 역할이 폭증한다규칙이 얽히면 결과를 예측하기 어렵다

RBAC 의 한계가 드러나는 자리가 있습니다. "본인이 작성한 글만 수정 가능" 같은 규칙은 역할로 표현되지 않습니다. 역할은 사용자에게 붙는 속성이고, 이 규칙은 사용자와 자원의 관계에 달려 있습니다.

그래서 실무에서는 둘을 섞습니다.

검사
역할이 기능에 접근할 수 있는 역할인가
관계이 자원의 소유자이거나 권한을 받았는가
맥락필요하면 시간, 위치, 상태 조건

이렇게 나누면 역할 수를 적게 유지하면서 세밀한 통제가 됩니다.

흔한 실수: 예외 상황마다 역할을 새로 만드는 것. "부서장", "부서장 조회전용", "타부서 부서장" 같은 역할이 늘어나면 누가 무엇을 할 수 있는지 아무도 모르게 됩니다. 관계 기반 검사로 옮길 것을 구분해야 합니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

더 깊이 공부하기

읽었으면 문제로 확인해보세요

API 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.