인증(Authentication)과 인가(Authorization) - 웹 애플리케이션 보안의 기초

StrayCat·2026년 2월 16일

1. 인증과 인가의 차이

인증 (Authentication)

  • 정의: 사용자가 실제 본인이 맞는지 확인하는 과정
  • 예시: 로그인, 지문인식, 2단계 인증 등
  • 핵심 질문: "당신은 누구인가?"

인가 (Authorization)

  • 정의: 인증된 사용자가 특정 리소스에 접근할 권한이 있는지 확인하는 과정
  • 예시: 관리자 페이지 접근, 파일 수정 권한, API 엔드포인트 접근 제한
  • 핵심 질문: "당신이 이것을 할 권한(자격)이 있는가?"

💡 둘의 개념이 헷갈리는 이유: 로그인의 경우 인증과 인가가 동시에 일어나기 때문입니다.

  • 비밀번호 입력 → 인증
  • 회원/비회원 권한 부여 → 인가

2. 웹 애플리케이션 인증의 특수성

HTTP 프로토콜의 특성

비연결성 (Connectionless)

  • 서버와 클라이언트가 지속적으로 연결되어 있지 않음
  • 이유: 서버 리소스 절약 (수많은 클라이언트와 동시 연결 시 서버 부담 급증)
  • 동작 방식: 요청 → 응답 → 연결 종료

무상태 (Stateless)

  • 서버가 클라이언트의 이전 상태를 저장하지 않음
  • 이유: 서버 메모리 부담 감소, 확장성 향상
  • 결과: 서버는 이전 요청을 기억하지 못함

문제점

"비연결성 + 무상태" 환경에서 어떻게 "사용자가 로그인되었다"는 상태를 유지할까?


3. 인증 방식

쿠키-세션 방식

동작 원리

[클라이언트]                    [서버]                    [세션 저장소]
    |                             |                             |
    |-- 1. 로그인 요청 ---------->|                             |
    |                             |-- 2. DB 유저 정보 확인 ---->|
    |                             |                             |
    |                             |<-- 3. 세션 생성 ------------|
    |                             |    (Session ID 발급)        |
    |<-- 4. Session ID 응답 ------|                             |
    |   (Set-Cookie 헤더)         |                             |
    |                             |                             |
[쿠키에 Session ID 저장]         |                             |
    |                             |                             |
    |-- 5. 요청 + Session ID ---->|                             |
    |   (Cookie 헤더)             |-- 6. Session ID 검증 ------>|
    |                             |<-- 7. 유저 정보 반환 -------|
    |<-- 8. 인증된 응답 ----------|                             |

특징

  • 서버에서 상태 관리: 세션 저장소에 로그인 정보 보관
  • Session ID: 유저 정보와 무관한 난수
  • 보안: 실제 유저 정보는 서버에만 존재
  • 단점: 세션 저장소 관리 필요, 확장성 제한

JWT (JSON Web Token) 방식

동작 원리

[클라이언트]                    [서버]
    |                             |
    |-- 1. 로그인 요청 ---------->|
    |                             |-- 2. DB 유저 정보 확인
    |                             |
    |                             |-- 3. JWT 토큰 생성
    |                             |    (유저 정보를 암호화)
    |<-- 4. JWT 토큰 응답 --------|
    |                             |
[로컬 스토리지/쿠키에 JWT 저장]  |
    |                             |
    |-- 5. 요청 + JWT 토큰 ------>|
    |   (Authorization 헤더)      |-- 6. JWT 검증 (서명 확인)
    |                             |-- 7. 토큰에서 유저 정보 추출
    |<-- 8. 인증된 응답 ----------|

특징

  • 서버에서 상태 미관리: 토큰 자체에 정보 포함
  • 자가 수용적 (Self-contained): 토큰만으로 인증 가능
  • 확장성: 서버 간 세션 공유 불필요
  • 단점: 토큰 크기가 큼, 만료 전 강제 무효화 어려움

4. 쿠키-세션 vs JWT 비교

구분쿠키-세션JWT
상태 관리서버(Stateful)클라이언트(Stateless)
저장소세션 저장소 필요불필요
확장성제한적우수
보안서버에서 관리 용이토큰 탈취 시 위험
성능세션 DB 저장소 조회 필요토큰 검증만 수행
로그아웃세션 삭제로 즉시 가능토큰 만료까지 유효

5. 기타 팁

보안 강화를 위한 추가 고려사항

  1. HTTPS 사용 필수: 토큰/세션 ID 탈취 방지
  2. 토큰 만료 시간 설정: 짧은 Access Token + 긴 Refresh Token 조합
  3. XSS/CSRF 방어:
    • JWT: HttpOnly 쿠키 사용 고려
    • 세션: CSRF 토큰 활용
  4. 민감 정보 제외: JWT에 비밀번호 등 민감 정보 포함 금지

선택 기준

  • 세션 방식: 전통적인 웹 애플리케이션, 강력한 보안 필요
  • JWT 방식: MSA, 모바일 앱, 확장성 중요한 서비스

인증과 인가는 웹 애플리케이션 보안의 핵심입니다. HTTP의 비연결성과 무상태 특성을 이해하고, 각 인증 방식의 장단점을 파악하여 프로젝트 요구사항에 맞는 방식을 선택하는 것이 좋습니다.

profile
알면 좋은 것보단 잊어버리기 싫은 것들을 기록합니다.

0개의 댓글