Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

자동 로그인 도입 및 인증 프로세스 개선 #490

Open
limehee opened this issue Aug 21, 2024 · 0 comments
Open

자동 로그인 도입 및 인증 프로세스 개선 #490

limehee opened this issue Aug 21, 2024 · 0 comments
Assignees
Labels
🔨 Refactor 코드 수정 및 개선

Comments

@limehee
Copy link
Collaborator

limehee commented Aug 21, 2024

Describe

사용자의 서비스 이용 편의성을 높이고 보안을 강화하기 위해 기존의 로그인 및 2단계 인증 정책을 개선하고자 합니다. 특히, 액세스 토큰 및 리프레시 토큰의 전달 방식을 변경하고, 권한별로 리프레시 토큰의 유효 기간을 다르게 설정하여 보안성을 강화할 계획입니다.

Tasks

1. 로그인 전용 커스텀 헤더명 변경

변경 사항

  • 기존: X-Clab-Auth
  • 변경: Clab-Auth

변경 이유

  • HTTP 헤더에서 커스텀 헤더에 사용되던 X- 접두사는 2012년 6월에 비표준 필드가 표준으로 전환되면서 발생하는 불편함을 이유로 폐기되었습니다. 이를 고려하여 커스텀 헤더명을 X-Clab-Auth에서 Clab-Auth로 변경합니다.
  • 참고 자료: HTTP headers - MDN Web Docs

2. 자동 로그인 구현을 위한 리프레시 토큰 전달 방식 변경

변경 사항

  • 기존: 액세스 토큰과 리프레시 토큰을 커스텀 헤더(X-Clab-Auth)에 담아 전달.
  • 변경:
    • 액세스 토큰은 새로운 커스텀 헤더(Clab-Auth)를 통해 전달.
    • 리프레시 토큰은 HTTP Only Cookie를 통해 전달.

변경 이유

  • Javascript Memory에서 토큰 정보가 사라지는 문제를 해결하기 위해, 리프레시 토큰을 HTTP Only Cookie로 전달하여 보안성과 편의성을 강화합니다.

3. 권한별 리프레시 토큰 기간 조정

변경 사항

Role 기존 리프레시 토큰 유효 기간 변경된 리프레시 토큰 유효 기간 비고
SUPER 2주 1주 최상위 권한으로 보안 강화
ADMIN 2주 2주 기존과 동일
USER 2주 4주 일반 사용자에게 더 긴 유효 기간 제공
GUEST 2주 1일 비회원 또는 제한된 권한 사용자

변경 이유

  • 자동 로그인 기능을 악용한 로그인 정보 탈취 범죄 가능성을 줄이기 위해, 권한에 따라 리프레시 토큰의 유효 기간을 다르게 설정합니다. 권한이 높을수록 자동 로그인 유지 기간이 짧아지도록 하여 보안을 강화합니다.
  • 참고 자료: 해커가 자동 로그인 기능을 좋아하는 이유

4. 리다이렉션 API 추가

변경 사항

  • 기존: 프론트엔드 Auth 시스템에서 환경별 리다이렉션을 하드코딩하여 사용.
  • 변경: 백엔드 DB에서 환경별 리다이렉션 정보를 관리하여, 프론트엔드에서 코드 변경 없이 동적으로 처리 가능하도록 개선.

변경 이유

  • 프론트엔드에서 코드 수정 없이 환경에 따라 동적으로 리다이렉션을 처리할 수 있도록 하기 위함입니다.

5. 로그인 상태 관리

변경 사항

  • 기존: 로그인 성공 여부에 대한 관리가 없어, 엔드포인트를 통해 로그인 없이 2단계 인증(2FA)이 가능한 문제가 존재.
  • 변경:
    • 로그인 성공 시 서버에서 2FA 활성 여부에 따라 Authorization Code를 발급하고, 이 코드를 응답의 data 값으로 전달.
    • 클라이언트는 2단계 인증 시 TOTP 인증 코드와 함께 Authorization Code를 서버에 전달하며, 서버는 이를 대조하여 로그인 성공/실패를 판단.

변경 이유

  • 로그인 없이 2단계 인증(2FA)이 가능한 보안 취약점을 제거하고, 2FA 과정의 보안성을 높이기 위함입니다.

6. 로그인 엔드포인트 변경

변경 사항

기능 기존 엔드포인트 변경된 엔드포인트 HTTP 메소드 설명
사용자 로그인 /api/v1/login /api/v1/auth/login POST 사용자 로그인 요청 및 인증
Guest 로그인 /api/v1/login/guest /api/v1/auth/login/guest POST Guest 로그인 요청 및 인증
토큰 재발급 /api/v1/login/reissue /api/v1/auth/token/refresh POST 리프레시 토큰을 사용하여 새로운 액세스 토큰 발급
현재 유효한 토큰 조회 /api/v1/login/current /api/v1/auth/token/current GET 현재 유효한 토큰 조회
2단계 인증 검증 /api/v1/login/authenticator /api/v1/auth/2fa POST 2단계 인증 검증
2단계 인증 초기화 /api/v1/login/authenticator/{memberId} /api/v1/auth/2fa/{memberId} DELETE 특정 회원의 2단계 인증 초기화

변경 이유

  • API 엔드포인트를 보다 명확하게 구분하고, 향후 확장성을 고려하여 엔드포인트 구조를 개선합니다.

ETC

로그인 과정에서 실패

Response body

{
  "success": false, // 로그인 실패
  "data": null
}

로그인 성공 && OTP 미사용자

Response body

{
  "success": true, // 로그인 성공
  "data": ""  // OTP 미사용을 의미
}

Response headers

clab-auth: {
    "accessToken": {access_token}
}

Cookie

Set-Cookie: refreshToken={refresh_token}; HttpOnly; Secure; Path=/; Max-Age={max_age}; SameSite=Strict;

로그인 성공 && OTP 사용자

Response body

{
  "success": true, // 로그인 성공
  "data": {authorization_code}  // OTP 사용을 의미
}

Response headers

clab-auth: {
    "accessToken": null
}

로그인 성공 && OTP 사용자 && 시크릿키 발급

Response body

{
  "success": true, // 로그인 성공
  "data": {authorization_code}  // OTP 사용을 의미
}

Response headers

clab-auth: {
    "secretKey": {secret_key}
}

OTP 사용자 && 로그인(OTP) 성공

Response body

{
  "success": true,
  "data": {authorization_code}
}

Response headers

clab-auth: {
    "accessToken": {access_token}
}

Cookie

Set-Cookie: refreshToken={refresh_token}; HttpOnly; Secure; Path=/; Max-Age={max_age}; SameSite=Strict;
@limehee limehee added the 🔨 Refactor 코드 수정 및 개선 label Aug 21, 2024
@limehee limehee self-assigned this Aug 21, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🔨 Refactor 코드 수정 및 개선
Projects
None yet
Development

When branches are created from issues, their pull requests are automatically linked.

1 participant