💡 개요
오늘은 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) (0) | 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 |