인증&인가 - dev-graft/syuck-syuck-docs GitHub Wiki

1. 정의

  • '인증'은 Syuck-Syuck 서비스에 가입된 회원임을 증명하는 과정을 뜻함.
  • '인가'는 '인증'이 통과하였음을 증명하는 정보 및 과정을 뜻함.

특징

  • JWT(Json Web Token) 기반 인증 방식
  • 권한이 필요한 API 요청은 AccessToken과 RefreshToken 두 가지가 동시에 필요.
  • 같이 생성된(키쌍이되는) AccessToken & RefreshToken을 전달해야 인가과정을 성공할 수 있도록하여, Token 조작 및 바꿔치기 등을 방지.
  • 토큰 재발급 시 기존 토큰은 폐기(삭제)해야 하며, 재활용되는 일이 없어야 한다.
  • 인증 설계 시 특정 사용자 및 토큰의 접근을 제한하는 블랙리스트 기능이 필요.
  • 토큰에 버전 정보를 추가하여, 특정 버전 미만의 토큰은 접근을 제한.

Token 설명

이름 변수 명 위치 만료시간 비고
Access Token ACCESS-TOKEN Header 10분 권한이 필요한 요청에 함께 포함하여 전달.
Refresh Token REFRESH-TOKEN Cookie 30일 CSS를 방지 하기 위해 httpOnly 추가
네트워크 감청을 방지하기 위해 https는 고려 중(Secure)
해당 토큰 생성과정에 SHA256(AccessToken) 값이 포함 된다.

2. 초기화 요청

  • Server의 RSA 공개키를 요청하는 작업을 뜻함
  • Client의 중요 정보를 보호하기 위한 사전작업
  • 해당 요청에서 전달받은 공개키를 통해 보호하고자 하는 정보를 암호화 후 Server에 전달한다.

과정

  1. Client에서 초기화 요청 진행
  2. 전달받은 공개키로 사용자가 입력한 정보(패스워드 등)을 암호화
  3. Server에 전달
변경 전 초기화 요청 프로세스

2. 초기화 요청

  • RSA256 알고리즘으로 생성된 키쌍을 서버와 교환하는 작업을 뜻함
  • Client와 Server가 정보를 주고 받는 과정에서 중요 정보가 노출되는 것을 차단하는 것을 목표함
  • 해당 과정은 서버의 공개키(이하 S.비밀키, S.공개키)를 전달받고, S.공개키를 이용하여 전달할 데이터를 암호화하는 것을 목표함

과정

  • Client에서 RSA256 알고리즘 랜덤 값을 기반으로 비밀키와 공개키를 생성(이하 C.비밀키, C.공개키)

  • Client는 서버에게 S.공개키를 요청하며, C.공개키를 전달

  • Server는 RSA256 랜덤 키 생성 및 S.비밀키를 세션에 저장 후 Client에게 전달받은 C.공개키로 S.공개키를 암호화 (S.공개키를 반환과정에 노출되는 것을 방지)

  • Client는 전달 받은 값을 C.비밀키로 복호화하여 S.공개키를 흭득

  • Client는 서버에 암호화하여 전달할 데이터를 S.공개키로 암호화 후 전달

  • Server는 전달받은 데이터를 복호화 후 세션 만료. (시간제한을 두는 방법을 추가했을 때 어떠한 이점이 있을 지 검토 중)

초기화 요청의 프로세스 변경 이유

기존 과정은 클라이언트가 공개키를 발행 후 서버에 전달하고, 서버는 해당 공개키를 통해 자신의 공개키를 암호화 하는 등 서버와 클라이언트 간의 정보를 최대한 감추고자하였다.
복잡한 과정의 진행방법을 생각했던 이유는 전송과정에서 제3자가 감청하는 것을 제한하기 위해서였다.
하지만 https와 같은 프로토콜에서 요청을 진행할 경우 발급된 인증서를 통해 암호화가 진행되므로, 이미 전송과정에서 감청은 불가능에 가까워, 기본사항만 적용하도록 하였다.

3. 로그인

  • Syuck-Syuck 서비스의 회원임을 증명하는 과정.

특징

  • 로그인 과정에 교환되는 사용자의 정보가 평문으로 노출되는 것을 방지하기 초기화 요청을 사전에 진행.

로그인 입력항목

속성 영문 비고
아이디 id
비밀번호 password 매 로그인 요청 마다 암호화 후 제출

상황 별 메세지

상황 메세지 status 비고
{정보} 미입력 후 로그인 요청을 시도했을 경우 {정보}를 입력해주세요 402(Payment Required) 아이디/패스워드 둘다 입력되지 않았을 시 아이디 기준
일치하는 로그인 정보가 없을 경우 로그인에 실패하였습니다 402(Payment Required)
로그인 정보가 탈퇴 상태일 경우 로그인에 실패하였습니다. 탈퇴한 계정입니다. 406(Not Acceptable)

플로우

구상 UI

image

4. 로그인 정보 갱신

특징

에러코드

5. 로그아웃

특징

  • 로그아웃 요청 후 메인 페이지로 이동

플로우

⚠️ **GitHub.com Fallback** ⚠️