API 전용 애플리케이션을 위한 인증 방식은 크게 세 가지로 나눌 수 있으며, 각 방식은 고유한 장단점을 가집니다.
API 인증 접근 방식
세션 기반 인증
- 설명: 전통적인 방식으로, 유효한 자격 증명으로 인증 후 사용자 및 세션 정보를 포함하는 암호화된 쿠키를 반환합니다.
- 장점: 보안 쿠키에 세션 저장(XSS 공격 위험 감소), 서버 관리 세션 상태(계정 삭제 시 모든 세션 종료 가능), Rails 기본 기능 활용.
- 단점: 모바일 앱과의 호환성 부족, 동일 도메인 요구사항, 세션 오버헤드(모든 요청에 DB/캐시 조회 필요), 타사 통합 제한.
JSON 웹 토큰 (JWT)
- 설명: 사용자 정보와 인증 데이터를 자체 포함 토큰에 인코딩하는 무상태 인증 방식입니다. 토큰은 헤더, 페이로드, 서명으로 구성됩니다.
- 장점: 무상태(서버 측 세션 저장 불필요), DB 조회 불필요, 모바일 앱 친화적.
- 단점: 보안 고려사항(토큰 탈취 시 위험), 로그아웃 복잡성(토큰 블랙리스트 필요), 만료 관리(토큰 갱신 메커니즘 필요).
베어러 토큰
- 설명: 사용자에게 무작위 토큰을 생성하여 DB에 저장하고, 클라이언트가 이 토큰을 Authorization: Bearer <token>헤더와 함께 사용하여 요청하는 무상태 방식입니다. JWT와 달리 토큰은 불투명하며 사용자 정보를 직접 포함하지 않습니다.
- 장점: DB를 통한 즉각적인 토큰 취소, 보안 이점(사용자 데이터 노출 없음, 토큰 사용 추적 가능), 플랫폼 간 유연성.
- 단점: 모든 요청에 DB 조회 필요(성능 문제 가능), XSS 취약성(localStorage 저장 시), 토큰 관리(만료, 로테이션, 정리).
Rails 8 Auth API 모드 구현
본 문서에서는 쿠키와 JWT의 중간 지점으로서 Rails 인증과 잘 통합되는 토큰 기반 인증을 사용합니다.
애플리케이션 설정
- rails new --api명령으로 API 전용 Rails 앱 생성.
- bin/rails generate authentication명령으로 인증 제너레이터 실행.
- bin/rails generate migration add_token_to_sessions token:uniq명령으로- sessions테이블에- token필드 추가.
- Project모델 생성 및- User와- Project간 관계 설정.
Session 모델 및 Authentication Concern 수정
- Session모델에- has_secure_token :token추가하여 토큰 자동 생성.
- Authenticationconcern 수정:- find_session_by_cookie를- find_session_by_token으로 변경.
- authenticate_with_http_token을 사용하여 요청 헤더에서 토큰 추출.
- require_authentication메서드를 수정하여 세션이 없으면- unauthorized응답 렌더링.
- start_new_session_for및- terminate_session메서드 수정.
 
- ApplicationController에- ActionController::HttpAuthentication::Token::ControllerMethods모듈 포함.
컨트롤러 구현 (로그인, 회원가입, 비밀번호 재설정)
- V1::SessionController구현:- create액션에서 사용자 인증 후 토큰 반환,- destroy액션에서 세션 종료.
- V1::RegistrationsController구현:- create액션에서 사용자 생성 및 세션 토큰 반환.- ActiveRecord::RecordNotUnique예외 처리.
- V1::PasswordsController구현:- create액션에서 비밀번호 재설정 이메일 전송,- update액션에서 토큰을 통해 사용자 확인 후 비밀번호 업데이트 및 관련 세션 모두 파기.
리소스 보호 및 프론트엔드 연동
- allow_unauthenticated_access가 명시되지 않은 리소스는 기본적으로 보호됩니다.
- V1::ProjectsController와 같은 리소스 컨트롤러에서- current_user.projects를 통해 인증된 사용자의 데이터에 접근할 수 있습니다.
- 프론트엔드 앱과의 통합을 위해 rack-cors젬을 사용하여 CORS를 설정하고, 성공적인 로그인 후 받은 토큰을 저장하여 후속 요청에 사용합니다.