Ch.26 인증과 보안 기초 — 로그인 구현
인증이란? — 너는 누구인가
로그인 기능 없는 앱은 메모장과 같다
열심히 앱을 만들었는데, 누가 누군지 구분이 안 됩니다. 모든 사용자가 같은 데이터를 보고, 남의 글도 삭제할 수 있죠.
사용자를 어떻게 구분하고, 권한은 어떻게 관리할까?
인증(Auth) — 사용자의 신원을 확인하고 적절한 권한을 부여하는 시스템입니다.
핵심 내용
인증은 "너 누구야?" 인가는 "너 이거 해도 돼?"
비유: 공항에서 여권 검사는 인증(신원 확인), 비즈니스 라운지 입장은 인가(권한 확인)입니다.
인증 방식은 크게 3가지가 있습니다
세션 방식: 로그인 → 서버에 세션 저장 → 쿠키로 세션ID 전달 → 매 요청마다 세션 조회
JWT 방식: 로그인 → 토큰 발급 → 클라이언트 저장 → 매 요청마다 토큰 첨부
OAuth 방식: 구글 로그인 클릭 → 구글 인증 → 토큰 반환 → 앱에서 사용
바이브 코더 추천: 개인 프로젝트에는 Supabase Auth(OAuth 내장)가 가장 빠릅니다. 세션/JWT 관리를 알아서 해줍니다.
JWT는 점(.)으로 구분된 3개의 파트입니다
eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiIxMjMiLCJyb2xlIjoiYWRtaW4ifQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
|___ Header ___|.___________ Payload ______________|.________ Signature ________|// Payload 디코딩해서 읽기 (보안 정보가 아님!)
const token = "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiIxMjMiLCJyb2xlIjoiYWRtaW4ifQ.xxx";
const payload = JSON.parse(atob(token.split(".")[1]));
console.log(payload);
// { userId: "123", role: "admin" }
// ⚠️ Payload는 암호화가 아닌 인코딩!
// 비밀번호 같은 민감 정보를 넣으면 안 됩니다."관리자만 글을 삭제할 수 있다"는 어떤 개념에 해당하는가?
JWT의 Payload는 암호화되어 있으므로 민감한 정보를 넣어도 안전하다.
JWT에서 토큰 위조를 방지하는 핵심 파트는?
핵심 용어
세션 (Session)
서버가 사용자 정보를 저장. 쿠키로 세션 ID 전달. 서버 부담 있음
토큰 (JWT)
사용자 정보를 토큰에 담아 클라이언트가 보관. 서버 무상태(stateless)
OAuth
구글/카카오 같은 외부 서비스로 로그인. 비밀번호 관리 불필요
Header
알고리즘과 토큰 타입 정보. {"alg": "HS256", "typ": "JWT"}
Payload
사용자 정보(userId, role 등). Base64 인코딩이라 누구나 읽을 수 있음!
Signature
위조 방지 서명. 서버의 비밀키로 생성. 이것이 핵심 보안 요소
비교 정리
| 항목 | 인증 (Authentication) | 인가 (Authorization) |
|---|---|---|
| 질문 | 당신은 누구입니까? | 이 작업을 할 권한이 있습니까? |
| 예시 | 이메일 + 비밀번호로 로그인 | 관리자만 삭제 버튼 표시 |
| 순서 | 먼저 수행 (1단계) | 인증 후 수행 (2단계) |
정리 노트
인증 & JWT 핵심 정리
인증 기본
- 인증(Authentication)
- 사용자가 누구인지 확인하는 과정 (로그인)
- 인가(Authorization)
- 인증된 사용자가 무엇을 할 수 있는지 결정 (권한)
- 세션 vs 토큰
- 세션은 서버에 저장, 토큰(JWT)은 클라이언트에 저장
JWT 구조
- Header
- 알고리즘과 토큰 타입 정보를 담은 메타데이터
- Payload
- 사용자 ID, 만료 시간 등 실제 데이터
- Signature
- 서버 비밀키로 생성된 위변조 방지 서명
JWT의 Payload는 누구나 볼 수 있으므로 비밀번호 같은 민감 정보를 넣으면 안 됩니다.
시각 자료
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작