인증과 인가

인증(Authentication)
인증은 사용자가 누구인지 확인하는 절차
시스템에 등록된 사용자인지를 증명하는 과정이라고 할 수 있음
- 웹사이트에 아이디와 비밀번호를 입력하여 로그인하는 것
- 스마트폰 잠금을 지문이나 얼굴 인식으로 해제하는 것
- 건물 출입구에서 신분증을 제시하여 신원을 확인받는 것
인증 = 로그인
인가(Authorization)
인가는 인증된 사용자가 특정 리소스나 기능에 접근할 수 있는 권한이 있는지 확인하는 절차
즉, 무엇을 할 수 있는지를 허가해 주는 과정
- 일반 사용자는 게시글을 읽고 쓸 수 있지만, 관리자는 다른 사용자의 게시글을 삭제할 수 있는 것
- 유료 구독자만 프리미엄 콘텐츠를 볼 수 있는 것
- 회사 건물에 출입은 했지만(인증), 특정 부서 사무실이나 서버실에는 들어갈 수 없는 것(인가)
인가 = 권한
요약 정리
인증(Authentication) = 신원 확인(로그인)
인가(Authorization) = 권한 부여(접근 제어)
인증은 인가보다 항상 먼저 수행되어야함!
세션과 JWT
세션(Session)
전통적으로 많이 사용되는 방식, 서버가 사용자의 로그인 상태를 기억하는 방식

- 동작 흐름
- 사용자 로그인:
사용자가 아이디/비밀번호로 로그인을 시도
- 세션 정보 생성 및 저장:
서버는 로그인 정보가 유효하면, 사용자를 위한 고유한 세션 ID를 생성하고 이 정보를 서버 메모리나 데이터베이스에 저장
- 세션 ID 전송:
서버는 생성된 세션 ID를 클라이언트(브라우저)에게 보내고, 브라우저는 보통 이 ID를 쿠키에 저장
- 요청과 검증:
이후 클라이언트는 서버에 요청을 보낼 때마다 쿠키에 담긴 세션 ID를 함께 보냄
서버는 이 세션 ID를 받아 저장된 세션 정보와 비교하여 사용자를 식별하고 요청을 처리
- 장점
- 서버에서 모든 세션 정보를 관리하므로 보안에 유리하고, 특정 사용자를 강제로 로그아웃시키는 등 제어가 쉬움
- 쿠키에 세션 ID만 저장하므로 클라이언트에 민감한 정보가 남지 않음
- 단점
- 사용자가 많아질수록 서버의 메모리나 DB 부하가 커짐
- 확장성 문제
JWT(Json Web Token)
최근 웹/앱 환경에서 널리 사용되는 방식, 서버가 로그인 상태를 저장하지 않는(stateless) 인증 방식
서버가 상태를 저장하지 않으므로 JWT 자체에 모든 인증 정보가 담겨있음

-
동작 흐름
- 사용자 로그인:
사용자가 아이디/비밀번호로 로그인을 시도
- 토큰 생성 및 전송:
서버는 로그인 정보가 유효하면, 사용자의 정보와 권한, 만료 시간 등을 담은 암호화된 토큰(Access Token)을 생성하여 클라이언트에게 보냄. 서버는 이 토큰을 저장하지 않음
- 토큰 저장:
클라이언트는 전달받은 토큰을 로컬 스토리지나 쿠키에 저장
- 요청과 검증:
이후 클라이언트는 서버에 요청을 보낼 때마다 HTTP 헤더에 토큰을 실어 보냄. 서버는 이 토큰의 서명을 검증하여 유효성을 확인하고 요청을 처리
-
장점
- 무상태(Stateless) 및 확장성:
서버가 토큰을 저장하지 않으므로 서버의 부하가 줄고, 여러 서버로 확장하기 용이.
서버가 토큰을 저장하지 않아도 유저를 식별할 수 있는 이유는, JWT 자체에 모든 인증 정보가 담겨있기 때문
- 유연성:
웹뿐만 아니라 모바일 앱 등 다양한 클라이언트 환경에서 사용하기 편리
-
단점
- 토큰이 탈취되면 만료될 때까지 악용될 수 있음
- 세션 ID보다 토큰의 크기가 더 큼
HTTP 헤더
HTTP Header는 Key: Value의 형태의 여러 정보들로 구성되어 있음