[개발 일기] 2025.05.03 - JWT 말고 인증에 사용할 만한 기술

2025. 5. 3. 13:21·개발 일기

💡 개요

 

오늘은 JWT 말고 인증에 사용할 만한 기술이 뭐가 있는지 정리해 보자.

 

 

 

🛠️ HMAC

 

HMAC을 사용하는 이유는 백엔드 서버가 HTTP 요청을 받았을 때, 해당 요청이 신뢰할 수 있는 요청인지 판별할 때 사용되는 기술이다.

 

 

사실 따지고 보면 이 기술은 완벽하게 JWT처럼 인증에 사용되는 기술은 아니다.

 

 

말 그대로 해당 요청이 우리가 알고 있는 클라이언트에서 온 것이 맞는지 검증하는 기술이기 때문이다.

 

 

뭐 어쨌든 HMAC을 사용해도 보안은 강화할 수 있으니까..!

 

 

요청 방식은 간단하다. 클라이언트가 요청에 서명을 추가하고, 서버가 이를 검증하는 방식이다.

 

 

만약 아래와 같은 HTTP 요청 메시지가 있다고 하자.

 

POST /api/order
body: {"itemId": "123", "amount": 2}
timestamp: 1714723440

 

 

그럼 클라이언트 측에서 다음과 같이 요청 메시지 내부의 데이터를 토대로 서명을 만들 수 있다.

 

data = method + path + body + timestamp
signature = HMAC-SHA256(secretKey, data)

 

그 후 HTTP 요청 헤더에 해당 서명을 추가한다.

 

 

이를 수신한 서버는 클라이언트 측에서 서명을 생성할 때 사용한 방식 그대로 HMAC을 계산한다.

 

serverSignature = HMAC-SHA256(secretKey, method + path + body + timestamp)

 

이를 통해 클라이언트 측에서 보낸 서명과 서버 측에서 만든 서명이 동일한 지 확인한다.

 

 

 

🛠️ HTTP Basic

 

HTTP Basic은 클라이언트가 요청을 할 때 아이디와 비밀번호를 매번 Base64로 인코딩하여 HTTP 요청 헤더에 포함하여 보내는 기술이다.

 

Authorization: Basic dXNlcjpwYXNz

 

 

그리고 서버는 해당 요청 헤더에 포함된 클라이언트 정보를 디코딩하여 적합한 클라이언트가 맞는지 검증한다.

 

 

사실 dXNlcjpwYXNz 이 문자열을 보면 굉장히 암호화가 진행된 것처럼 보인다. 하지만 이는 인코딩만 되어있는 것이지, 실제로 암호화되어있지 않다.

 

 

그렇기 떄문에 저 문자열이 탈취당할 경우 사용자의 아이디와 비밀번호가 그대로 노출될 수 있다.

 

 

그렇기 떄문에 웬만하면 HTTPS와 함께 사용하거나, 사용하지 말자..

 

 

 

🛠️ HTTP Digest Authentication

 

HTTP Digest Authentication은 사용자의 비밀번호를 평문으로 절대! 요청 메시지에 담지 않는다.

 

 

이 기술이 탄생하게 된 계기는 HTTP Basic보다 더 안전한 인증 방식을 사용하기 위해서이다.

 

 

 

 

다이제스트 인증 방식은 클라이언트와 서버가 통신을 진행할 때 digest()라는 메서드를 통과시킨 후 실제 비밀번호를 암호화하여 전송한다.

 

 

그런데 만약 탈취자(공격자)가 digest() 메서드의 결과값인 비밀번호를 탈취한다면, 문제가 발생하지 않는가에 대해 걱정할 수 있다.

 

 

그렇기 때문에 서버는 클라이언트에게 nonce를 전송하여 이를 방지한다.

 

WWW-Authenticate: Digest realm="example", nonce="abc123xyz"

 

nonce란 공격자가 digest() 결과 비밀번호를 탈취하고 요청을 보낸다면, 해당 요청은 두 번째 요청이 될 것이다. (이미 클라이언트가 요청을 보낸 이후이기 때문)

 

 

만약 이전에 사용했던 nonce가 또 왔다?? 그렇다면 nonce를 재사용한 경우이기 때문에 해당 요청을 악의적인 요청이라고 판단하고 요청을 거절한다.

'개발 일기' 카테고리의 다른 글

[개발 일기] 2025.05.05 - 비밀번호 암호화 (Feat : BCryptPasswordEncoder)  (1) 2025.05.05
[개발 일기] 2025.05.04 - JWT 페이로드 종류  (0) 2025.05.04
[개발 일기] 2025.05.02 -GraphQL, gRPC  (2) 2025.05.02
[개발 일기] 2025.05.01 - ws vs wss (Feat: Nginx)  (0) 2025.05.01
[개발 일기] 2025.04.30 - REST  (0) 2025.04.30
'개발 일기' 카테고리의 다른 글
  • [개발 일기] 2025.05.05 - 비밀번호 암호화 (Feat : BCryptPasswordEncoder)
  • [개발 일기] 2025.05.04 - JWT 페이로드 종류
  • [개발 일기] 2025.05.02 -GraphQL, gRPC
  • [개발 일기] 2025.05.01 - ws vs wss (Feat: Nginx)
오도형석
오도형석
  • 오도형석
    형석이의 성장일기
    오도형석
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • MSA 모니터링 서비스
        • DB
      • 스파르타 코딩클럽
        • SQL
        • Spring
      • 백엔드
        • Internet
        • Java
        • DB
      • 캡스톤
        • Django
        • 자연어처리
      • Spring
        • JPA
        • MSA
      • ETC
        • ERROR
      • 개발 일기 N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
오도형석
[개발 일기] 2025.05.03 - JWT 말고 인증에 사용할 만한 기술
상단으로

티스토리툴바