백엔드 개발자와 인증 토큰 논의 시 확인해야 할 핵심 질문들과 예상 답변입니다. 이 체크리스트를 통해 프론트엔드 인증 구현을 위한 모든 필요한 정보를 확보하세요.
"저희는 JWT를 사용합니다. 토큰에는 사용자 ID, 역할(role), 권한(permissions)이 포함됩니다. 서명 알고리즘은 HS256을 사용하고 있습니다. 토큰 구조는 header.payload.signature 형식입니다."
"네, 두 토큰 모두 사용합니다. Access Token은 30분, Refresh Token은 7일간 유효합니다. Access Token은 메모리(상태)에 저장하고, Refresh Token은 HTTP-Only 쿠키로 저장하는 것을 권장합니다. 만약 쿠키를 사용할 수 없는 환경이라면, Refresh Token은 로컬 스토리지에 저장할 수 있지만 보안상 리스크가 있음을 인지해야 합니다."
"로그인 엔드포인트는 POST /api/auth/login이고, 응답은 {accessToken, refreshToken, user} 형식입니다.
토큰 갱신은 POST /api/auth/refresh로 요청하며, refreshToken은 쿠키로 자동 전송됩니다.
로그아웃은 POST /api/auth/logout으로 요청하며, 서버에서 Refresh Token을 블랙리스트에 추가합니다.
API 요청 시 Authorization: Bearer {accessToken} 형식의 헤더를 사용합니다."
"CSRF 토큰을 사용합니다. 모든 변경 요청(POST, PUT, DELETE)에 X-CSRF-Token 헤더가 필요합니다.
XSS 대응으로 Content-Security-Policy 헤더를 설정했습니다.
토큰 탈취 시 사용자 ID 기반으로 모든 토큰을 무효화할 수 있습니다.
쿠키는 HttpOnly=true, Secure=true(프로덕션), SameSite=Lax 속성을 사용합니다."
"토큰 만료 시 401 Unauthorized와 {error: 'token_expired', message: '토큰이 만료되었습니다'} 응답을 보냅니다.
인증되지 않은 요청은 401 Unauthorized와 {error: 'unauthorized', message: '인증이 필요합니다'} 응답입니다.
권한 부족은 403 Forbidden과 {error: 'forbidden', message: '접근 권한이 없습니다'} 응답입니다.
클라이언트는 401 응답에서 error 코드를 확인하여 'token_expired'인 경우 토큰 갱신을 시도해야 합니다."
"로그인 성공 응답:
{
'accessToken': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
'user': {
'id': 'user-123',
'email': 'user@example.com',
'name': '홍길동',
'role': 'MANAGER',
'permissions': ['equipment.view', 'production.edit']
},
'expiresIn': 1800
}
토큰 갱신 응답:
{
'accessToken': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
'expiresIn': 1800
}
인증 오류 응답:
{
'error': 'token_expired',
'message': '토큰이 만료되었습니다',
'status': 401
}"
"테스트 계정: 이메일 test@example.com, 비밀번호 Test1234!
개발 환경 API: https://dev-api.example.com
CORS는 개발 중 localhost:3000, localhost:5173이 허용됩니다.
API 문서는 https://dev-api.example.com/api-docs에서 확인 가능합니다."
"다중 기기 로그인을 지원합니다. 각 기기는 독립적인 Refresh Token을 받습니다.
비밀번호 변경 시 모든 기기의 Refresh Token이 무효화됩니다.
구글, 카카오 소셜 로그인을 지원하며, OAuth2 흐름을 따릅니다.
개발 환경에서는 /api/auth/debug-token 엔드포인트로 토큰 정보를 확인할 수 있습니다."