← 목록으로

인증과 인가의 차이

인증과 인가의 차이

서론

보안 이야기를 할 때 항상 나오는 단골 용어가 인증(Authentication)인가(Authorization) 입니다.
말도 비슷하고 함께 쓰이다 보니, 처음에는 둘의 차이가 헷갈리기 쉽습니다.

이 글에서는 초보 개발자의 입장에서,
인증과 인가가 실제 서비스에서 어떻게 다르게 작동하는지 예시를 통해 정리해 보겠습니다.

1. 인증(Authentication) - 너 누구야?

인증은 말 그대로 "너 누구야?"를 확인하는 과정입니다.

예시:

  • 로그인 폼에서 아이디/비밀번호를 입력
  • 소셜 로그인(Google, GitHub 등)으로 본인 계정을 증명
  • OTP, SMS, 인증 앱으로 2단계 인증을 거치는 것

핵심 질문은 항상 같습니다.

  • "이 사용자는 정말 본인이 맞는가?"

인증 성공 후에는:

  • 보통 세션, 쿠키, 토큰(JWT 등)을 발급해서
  • 이후 요청에서도 "이 사람은 방금 로그인한 그 사람"임을 확인합니다.

2. 인가(Authorization) - 뭘 할 수 있어?

인가의 질문은 다릅니다.

  • "이 사람은 무엇까지 할 수 있는가?"

예:

  • 일반 사용자는 본인 글만 수정/삭제 가능
  • 관리자는 모든 글 관리 가능
  • 특정 조직/팀만 관리 콘솔 접근 허용

즉, 인가는 권한/역할/규칙을 기반으로:

  • "이 요청을 허용할지, 거절할지"를 결정하는 단계입니다.

3. 인증 vs 인가, 정리

짧게 외우기:

  • 인증: 너 누구야? (Who are you?)
  • 인가: 뭘 할 수 있어? (What can you do?)

조금 더 현실 예시로 보면:

  • 건물 출입 카드 태깅 → 인증
  • 몇 층까지 엘리베이터 버튼이 눌리는지, 어떤 방 문이 열리는지 → 인가

4. 코드 레벨에서의 예시

간단한 API 예시를 떠올려 보면:

  1. 요청 헤더의 토큰을 검증 → 인증
  2. 토큰 안에 들어 있는 역할/사용자 ID를 기준으로:
    • 이 리소스를 읽을 수 있는지
    • 쓸 수 있는지
    • 삭제할 수 있는지 확인 → 인가

초보 개발자가 자주 하는 실수 중 하나:

  • "로그인만 되면 다 할 수 있게 만들어 버리는 것"

실제로는:

  • 요청마다 "이 기능은 누구까지 허용해야 하는지" 를 고민하고,
  • 코드/정책으로 그 기준을 명시해야 합니다.

마무리

인증과 인가는 보안의 가장 기초적인 개념이지만,
서비스가 커질수록 이 둘을 깔끔하게 나누어 설계하는 것이 점점 더 중요해집니다.

정리하면:

  • 인증은 사용자의 신원을 확인하는 절차
  • 인가는 확인된 사용자에게 어떤 권한을 줄지 결정하는 절차

앞으로 로그인 기능이나 관리자 페이지를 만들 때, "지금 이 코드는 인증을 다루고 있는가? 인가를 다루고 있는가?"를 의식하면서 작성해 보면
보안 관점에서 한 단계 더 성장할 수 있을 것입니다.