인증과 권한부여

김윤기·2025년 4월 17일
post-thumbnail

인증과 권한 부여의 정의

인증(Authentication)

사실을 증명하는 과정

  • the process or action of proving or showing something to be true, genuine, or valid
  • the process or action of verifying the identity of a user or process

출처 - 옥스퍼드 사전

사용자의 신원을 확인하는 과정입니다. 예를 들자면, 사용자의 이름과 비밀번호와 같이 신원을 확인 할 수 있는 정보를 가지고 자격 증명을 제공합니다.

인가 (Authorization)

확인 가능한 권한이 있는지? 확인 하는 것

  • the action of authorizing
  • a document giving official permission

출처 - 옥스퍼드 사전

인증된 사용자가 어떤 자료에 접근 할 수 있는지 권한을 확인하여 작업을 수행할 수 있는지 정의하는 지에 따라 권한과 역할을 확인합니다.

AuthenticationAuthorization
사용자의 자격 증명사용자가 내용을 확인할 권한이 있는지
로그인, 댓글 게시, 구매 진행게시물 보기, 게시물 삭제, 관리 패널 접근

JWT(JSON Web Token)

인터넷 표준 인증 방식(RFC 7519)으로 JSON 객체를 통해 사용자 정보를 안전하고 쉽게 암호화(HMAC, RSA, ECDSA를 사용한 공개/비공개 키를 사용) 힙니다.

서명된 토큰과 암호화된 토큰 두 개 다 암호화 통해 비밀 유지가 가능하지만, 서명된 토큰은 요청의 무경성을 검증할 수 있지만, 암호화된 토큰은 다른 당사자가 요청을 확인할 수 없도록 숨길 수 있습니다. 공개키/개인키를 사용해 토큰으로 사용한다면 보안키를 이용해야만 확인 할 수 있으므로 해당 내용을 보증할 수 있습니다.

인증

모든 사용자의 요청에 JWT를 통한 서비스 접근 가능하며 부하가 적고 다른 도메인인 경우에도 사용가능하기 때문에 SSO(Single Sign On) 기능에 주로 활용됩니다.

정보 교환

공개키/개인키를 통한 보안키로 암호화 되었기 때문에 요청자의 신원을 검증할 수 있으며, 헤더와 페이로드를 통해 계산되기에 전송된 콘텐츠가 변조로부터 안전합니다.

JWT의 구조

  • Header : 토큰의 타입과 사용된 알고리즘
  • Payload : 요청에 대한 정보
  • Signature : 비밀키
- Header 예시
{
  "alg": "HS256",
  "typ": "JWT"
}

- Payload 예시
**{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}**

- Signature 예시
// 압축을 통해 서명 생성
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
  ****

JWT = Header + Payload + Signature

JWT는 HTML 및 HTTP 환경에서 쉽게 전달하며 세 개의 점으로 구분된 Base64 URL의 문자열로 구성 되있어, XML과 SAML 기반 보다 간결합니다.

어떻게 JSON Web Tokens은 작동하나요 ?

인증에서 자격 증명을 통해 인증에 성공하면 JSON 웹 토큰은 반환됩니다. 토큰으로 증명하는 방법을 통해 보안 이슈를 쉽게 예방할 수 있습니다. 일반적으로 오랬동안 가지고 있지 않아도 됩니다.

사용자가 접근 할 때마다 사용자는 일반적으로 Bearer 구조를 사용하여 Authorization 헤더에서 JWT를 보냅니다.

JWT는 일반적으로 Authorization의 헤더와 Bearer의 구조로 되어있으며 다음과 같이 표시됩니다.

Authorization: Bearer <token>

경우에 따라 상태를 저장하지 않는 권한 부여 구성일 수 있습니다. 서버는 접근시 헤더의 유효성만 확인하고 데이터에 접근 할 수 있게 해줍니다.

JWT에 몇몇 데이터를 같이 보내게 된다면, 데이터 베이스에 접근하지 않아도 데이터를 전달 할 수 있습니다.

보통 토큰의 크기는 8KB 미만의 크기입니다. 그리고 CORS(Cross-Origin Resource Sharing)로 쿠키를 사용하지 않으므로 해당 문제는 없습니다.

JSON Web Token을 사용하는 이유?

SWT(Simple Web Token) 및 SAML(Security Assertion Markup Language Tokens)과 비교할 때 JWT(JSON Web Token) 더 큰 이점을 가지고 있기에 사용합니다.

XML의 형식은 인코딩시에 장황하고, 데이터의 크기도 크지만 JSON은 그렇지 않으며 대칭 서명을 통한 방식으로 구현하기 더 쉬워 보안이 더 강력합니다.

대부분의 프로그램은 map 방식을 통해 JSON 형식을 객체로 변환되기 쉬우며 이는 활용하기 좋게 해줍니다.

JWT의 유효성과 증명 (Validating and Verifying)

  • 유효성 검사는 토큰이 올바른 구조를 가지고 있고, 적용 가능한 요청을 포함하고 있는지 확인합니다.
  • 검증은 토큰이 진본이며 수정되지 않았음을 확인하는 과정입니다.

유효성 검사

  • 구조
    header, payload, signature의 세 구조가 점으로 구분
  • 형식
    예상한 요청으로 인코딩 되어 있는지 확인
  • 내용
    페이로드의 요청이 맞는다면 만료시간 (exp)이 유효한지 확인 ( 이전 시간이거나, 만료된 시간이거나)

증명 검사

  • 서명 확인
    헤더와 페이로드를 기반으로 다시 서명을 생성하여 기존 서명과 비교하여 서명을 확인합니다.
  • 발급자 검증( Issuer Verification)
    aud 요청을 검토하여 토큰이 지정된 수신자에게 발급되었는지 확인합니다.
  • 대상 확인 ( Audience Check )
    aud 요청을 검토하여 토큰이 지정된 수신자에게 발급되었는지 확인합니다.

출처

01) 인증과 권한 부여

JWT.IO - JSON Web Tokens Introduction

🔐 JWT 완벽 가이드

profile
글을 잘 쓰고 싶은 개발자 ✨

0개의 댓글