CS/필수지식

인증(Authentication) 기본 개념 (Spring boot / Flask

Coding Kitsune 2025. 4. 10. 23:59

 

Flask와 Spring boot 프로젝트를 진행하면서 회원가입/로그인 및 인증부분은 프로젝트 완성도 면에서 중요하다고 생각되어 이번기회에 이부분에 대해서 실제 서비스에서 사용되는 로직과 가깝게 구현할 수 있도록 공부를 진행중이다.

 

 

인증(Authentication) 기본 개념

인증이란?
👉 “이 사용자가 누구인지 증명하는 과정
(예: 로그인 → 사용자 정보를 확인하고 ‘누군지’ 알아내는 것)

 

Authentication 로그인처럼 "이 사람이 누군가?" 증명
Authorization 권한 검사 (예: 관리자인가 ??)
Session 서버에 저장하는 로그인 정보
JWT (Token) 클라이언트에 저장하는 로그인 정보 (stateless)
OAuth2 소셜 로그인 방식 (카카오, 네이버, 구글 등)
HttpOnly 쿠키 보안 강화를 위한 쿠키 방식

 

 

 

인증 방식의 종류

✅ 세션 기반 (Session) 로그인 시 서버에 사용자 정보 저장, 클라이언트는 세션ID만 저장 Django 기본, Flask-Login
✅ 토큰 기반 (JWT) 로그인 시 토큰 발급 → 클라이언트가 이 토큰을 가지고 있음 대부분의 SPA, 모바일 앱
✅ 쿠키 기반 (HttpOnly 쿠키) JS로 접근 불가, 서버가 응답 시 쿠키 설정 → 자동 요청에 포함됨 보안 우선 서비스
✅ OAuth2 다른 서비스(구글/카카오 등)로 로그인 인증 소셜 로그인 기능

 

 

Spring Boot에서 인증 흐름

1. 세션 방식

  • Spring Security 기본 동작
  • 로그인 → 서버에서 HttpSession에 사용자 정보 저장
  • 요청 시 JSESSIONID 쿠키로 유저 판별

 

2. JWT 방식

  • spring-security + JWT 필터 직접 구현 or 라이브러리 사용
  • 요청마다 Authorization 헤더에 토큰 포함
  • 필터 체인에서 토큰 검증 후 SecurityContext에 사용자 정보 저장

 

3. OAuth2 로그인

  • spring-security-oauth2-client 사용
  • 구글, 네이버, 카카오 등 외부 서비스 로그인 연동

 

Flask에서 인증 흐름

1. 세션 방식

  • Flask-Login 패키지 사용
  • 로그인 시 login_user() → 세션 쿠키에 저장
  • 요청마다 current_user로 사용자 확인 가능

 

2. JWT 방식

  • flask-jwt-extended 사용
  • 로그인 시 create_access_token() → JWT 발급
  • API 요청 시 헤더에 Authorization: Bearer 토큰 추가
  • @jwt_required()로 보호된 라우트 지정 가능

 

Flask vs Spring Boot 비교

 

이 부분에서 Spring boot의 편리성과 생태계가 얼마나 잘되어있는지 느낄 수 있었다.

대부분 Flask와 비교함에 있어서, Spring boot는 내장되어있지만 Flask에 비해 조금 더 어려울 때가 많은것 같다.

ChatGPT한테 물어보니 JWT가 점점 더 많이 쓰이고 있다고 한다.

 

 

 

왜 JWT가 실무에서 많이 쓰이냐?

1. REST API + SPA 조합의 폭발적 증가

  • 프론트는 React/Vue, 백엔드는 API만 → 세션 못 씀
  • 클라이언트가 토큰을 들고 다녀야 하니까 JWT 필수

 

2. 서버 간 확장에 유리

  • JWT는 서버가 상태(state)를 기억하지 않아도 됨 → 수평 확장 쉬움
  • 로그인한 유저 상태를 유지할 세션 저장소 필요 없음

 

3. 모바일 앱, 외부 연동 등에 적합

  • 모바일이나 외부 시스템 연동할 때도 쉽게 인증 가능

 

 

실무 선택 기준 요약