인증과 인가의 차이
인증과 인가의 차이
서론
보안 이야기를 할 때 항상 나오는 단골 용어가 인증(Authentication) 과 인가(Authorization) 입니다.
말도 비슷하고 함께 쓰이다 보니, 처음에는 둘의 차이가 헷갈리기 쉽습니다.
이 글에서는 초보 개발자의 입장에서,
인증과 인가가 실제 서비스에서 어떻게 다르게 작동하는지 예시를 통해 정리해 보겠습니다.
1. 인증(Authentication) - 너 누구야?
인증은 말 그대로 "너 누구야?"를 확인하는 과정입니다.
예시:
- 로그인 폼에서 아이디/비밀번호를 입력
- 소셜 로그인(Google, GitHub 등)으로 본인 계정을 증명
- OTP, SMS, 인증 앱으로 2단계 인증을 거치는 것
핵심 질문은 항상 같습니다.
- "이 사용자는 정말 본인이 맞는가?"
인증 성공 후에는:
- 보통 세션, 쿠키, 토큰(JWT 등)을 발급해서
- 이후 요청에서도 "이 사람은 방금 로그인한 그 사람"임을 확인합니다.
2. 인가(Authorization) - 뭘 할 수 있어?
인가의 질문은 다릅니다.
- "이 사람은 무엇까지 할 수 있는가?"
예:
- 일반 사용자는 본인 글만 수정/삭제 가능
- 관리자는 모든 글 관리 가능
- 특정 조직/팀만 관리 콘솔 접근 허용
즉, 인가는 권한/역할/규칙을 기반으로:
- "이 요청을 허용할지, 거절할지"를 결정하는 단계입니다.
3. 인증 vs 인가, 정리
짧게 외우기:
- 인증: 너 누구야? (Who are you?)
- 인가: 뭘 할 수 있어? (What can you do?)
조금 더 현실 예시로 보면:
- 건물 출입 카드 태깅 → 인증
- 몇 층까지 엘리베이터 버튼이 눌리는지, 어떤 방 문이 열리는지 → 인가
4. 코드 레벨에서의 예시
간단한 API 예시를 떠올려 보면:
- 요청 헤더의 토큰을 검증 → 인증
- 토큰 안에 들어 있는 역할/사용자 ID를 기준으로:
- 이 리소스를 읽을 수 있는지
- 쓸 수 있는지
- 삭제할 수 있는지 확인 → 인가
초보 개발자가 자주 하는 실수 중 하나:
- "로그인만 되면 다 할 수 있게 만들어 버리는 것"
실제로는:
- 요청마다 "이 기능은 누구까지 허용해야 하는지" 를 고민하고,
- 코드/정책으로 그 기준을 명시해야 합니다.
마무리
인증과 인가는 보안의 가장 기초적인 개념이지만,
서비스가 커질수록 이 둘을 깔끔하게 나누어 설계하는 것이 점점 더 중요해집니다.
정리하면:
- 인증은 사용자의 신원을 확인하는 절차
- 인가는 확인된 사용자에게 어떤 권한을 줄지 결정하는 절차
앞으로 로그인 기능이나 관리자 페이지를 만들 때,
"지금 이 코드는 인증을 다루고 있는가? 인가를 다루고 있는가?"를 의식하면서 작성해 보면
보안 관점에서 한 단계 더 성장할 수 있을 것입니다.