Q.인증(Authentication)과 인가(Authorization) 차이는?
| 항목 | 인증 | 인가 |
|---|
| 묻는 것 | 누구인가 | 무엇을 할 수 있는가 |
| 순서 | 먼저 | 인증 후 |
| 실패 코드 | 401 | 403 |
| 예 | 로그인, 토큰 검증 | 관리자만 삭제 가능 |
상태 코드 구분이 실무에서 자주 틀립니다.
| 상황 | 코드 |
|---|
| 토큰이 없다 | 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 차이는?
| 항목 | RBAC | ABAC |
|---|
| 기준 | 역할 | 속성의 조합 |
| 예 | 관리자면 삭제 가능 | 같은 부서이고 근무 시간이면 조회 가능 |
| 관리 | 역할에 권한을 붙인다. 단순 | 규칙을 정의한다. 유연하다 |
| 확인 | 역할 목록만 보면 된다 | 요청 맥락까지 평가해야 한다 |
| 문제 | 예외가 생기면 역할이 폭증한다 | 규칙이 얽히면 결과를 예측하기 어렵다 |
RBAC 의 한계가 드러나는 자리가 있습니다. "본인이 작성한 글만 수정 가능" 같은 규칙은 역할로 표현되지 않습니다. 역할은 사용자에게 붙는 속성이고, 이 규칙은 사용자와 자원의 관계에 달려 있습니다.
그래서 실무에서는 둘을 섞습니다.
| 층 | 검사 |
|---|
| 역할 | 이 기능에 접근할 수 있는 역할인가 |
| 관계 | 이 자원의 소유자이거나 권한을 받았는가 |
| 맥락 | 필요하면 시간, 위치, 상태 조건 |
이렇게 나누면 역할 수를 적게 유지하면서 세밀한 통제가 됩니다.
흔한 실수: 예외 상황마다 역할을 새로 만드는 것. "부서장", "부서장 조회전용", "타부서 부서장" 같은 역할이 늘어나면 누가 무엇을 할 수 있는지 아무도 모르게 됩니다. 관계 기반 검사로 옮길 것을 구분해야 합니다.
먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.
읽었으면 문제로 확인해보세요
API 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.