Authentication & Authorization, JWT

unhyif·2023년 6월 19일

회사의 로그인 코드를 이해하는 과정에서 관련된 개념들을 공부해 보았다.

Authentication (인증)

사용자의 신원을 확인하는 과정

Factors

  • 지식 기반: 사용자만 알고 있는 것 ex) 비밀번호, 이름, 주민번호, 사번
  • 소유 기반: 사용자만 소유하고 있는 것 ex) 인증서, OTP, SMS 인증
  • 속성 기반: 사용자만이 고유하게 지닌 것 ex) 지문, 홍채, 정맥, 얼굴
  • One Factor Authentication: 1가지 요소를 사용하는 인증
  • Two Factor Authentication: 2가지 요소를 사용하는 인증
  • Multi Factor Authentication: 2가지 이상의 요소를 사용하는 인증

Techniques

  • 비밀번호 기반 인증 방식
    • 주로 단방향 해쉬 함수로 비밀번호를 암호화하여 DB에 저장함
    • cf) 단방향 해쉬 함수: 원본 메시지를 암호화할 수 있음. 원본 메시지를 알면 암호화된 메시지를 알 수 있지만, 반대는 불가능함
  • OTP: 1회용 비밀번호를 사용하는 인증 방식
  • 2FA/MFA: 여러 인증 요소를 사용하여 유연하고 보안이 강화된 인증 방식
  • SSO: 한 번의 인증으로 다양한 시스템에 재인증 없이 접근할 수 있는 인증 방식
  • Social Authentication: SNS의 기존 자격 증명을 사용하는 인증 방식
  • API Authentication: 서비스에 액세스하려는 사용자를 API key/token으로 식별하는 인증 방식
  • 생체 인증: 고유한 생물학적 특징을 사용하는 인증 방식

Authorization (권한 부여)

사용자의 특정 리소스에 대한 접근 권한을 확인하는 과정

Techniques

  • API Key
  • Access Token (ex: JWT Token)
  • OAuth: 사용자가 비밀번호를 제공하지 않고 다른 웹사이트의 본인 계정 정보에 대해 접근 권한을 부여할 수 있는 방식

access token을 사용한 절차

  1. Authentication을 통해 access token을 발급함
  2. request 시 access token을 첨부하여 보냄
  3. 서버는 받은 access token을 복호화하여 사용자 정보를 얻음
  4. 사용자 정보를 통해 사용자의 권한을 확인함
  5. 권한이 있다면 해당 request를 처리함

JWT (JSON Web Token)

JSON 형식의 토큰으로, 주로 인증/인가를 위해 사용됨

구성

<Header>.<Payload>.<Signature>
  • Header: 토큰 타입, 해쉬 알고리즘 정보가 BASE64Url 방식으로 인코딩됨
    {
    "alg": "HS256",
    "typ": "JWT"
    }
  • Payload: 여러 claim (name:value 쌍인 정보 조각)들이 BASE64Url 방식으로 인코딩됨
    • Registered claim: JWT 사양에 이미 정의된 클레임 (ex: 토큰 발급자 iss, 토큰 만료 기한 exp)
    • Public claim: 충돌 방지를 위해 URI 형식의 name을 가진 클레임
    • Private claim: server와 client 간에 협의된 클레임
      • 민감하지 않은 고유 정보가 들어감 (ex: id)
  • Signature: Header/Payload를 secret key(별도 생성)와 헤더에 지정된 알고리즘으로 암호화한 것을 인코딩한 값
    • client가 JWT를 server로 전송하면 server는 JWT의 signature를 복호화하여 위변조 여부를 검증함

장점

  1. 토큰에 사용자 정보가 포함되어 있어 세션 관리가 필요 없으므로 서버 자원과 비용을 절감할 수 있음
  2. signature를 통해 토큰의 위변조 여부를 검증할 수 있음

단점

  1. server가 client를 제어할 수 없음
  2. 내용이 많아지면 네트워크 통신 시 부하가 생길 수 있음
  3. 쉽게 payload를 디코딩할 수 있으므로 민감한 정보를 담을 수 없음
  4. 탈취 당하면 만료될 때까지 대처가 어려움

보완 방법

  1. 짧은 만료 기한을 설정함
  2. 민감한 작업을 수행할 때에는 2FA와 같이 추가적인 인증을 통해 보안을 강화함
  3. request 시 access token을 재발급하여 만료 기한을 연장하는 방식
  4. request 시 access token이 만료됐을 때 refresh token으로 access token을 재발급하는 방식
    cf) refresh token: access token의 재발급을 위한 토큰으로, access token보다 긴 만료 기한을 가짐. 또한 검증을 위해 서버에 따로 저장해 두어야 하며, 추가적인 I/O 작업이 수반됨

Reference:
https://baek.dev/post/24/
http://www.opennaru.com/opennaru-blog/jwt-json-web-token/
https://www.daleseo.com/jwt/
https://velopert.com/2389
https://brunch.co.kr/@jinyoungchoi95/1
https://m.blog.naver.com/dilrong/222039327623

0개의 댓글