2025. 1. 12. 15:19ㆍProgramming Language/Node.js
01. 인증 서비스 구현을 위해서 필요한 지식
https에선 요청에 많은것을 담지 않기 위해서 stateless라는 성격을 띄고 있다.
그렇기에 각각의 요청은 각각의 요청에서만 구별하지 요청들끼리에 공통적인 특정을 요청만으로는 알수 없다.
간단하게 이야기하자면 A라는 사람이 B라는 서버에게 1번 요청을 보내고 B 서버에서 그에 대한 1번 응답을 보낸다 하더라고 2번 요청때 B 서버는 이 요청이 A가 보냈다고 하더라도 A가 보낸 요청임을 알수가 없다는 것이다.
이게 stateless이다.
이를 해결하기 위해서 토큰을 사용하는데 이 과정은
A클라이언트가 B 서버에 요청을 보내면 B서버는 A 클라이언트에게 응답과 함께 토큰을 생성해서 전달한다.
그러면 A 클라이언트는 B 서버에게 다음 요청에 대해서 토큰을 같이 보내고 B 서버는 이 토큰을 확인하고 A 클라이언트에서 요청이 다시 왔다고 인식하게 되는 것이다.
이게 인증 및 인가 절차이다.
02. JWT에 대해서
위에서 확인했던 인증 및 인가 절차에서 우리는 JWT라는 모듈을 사용할 것이다.
JWT란
JWT (JSON Web Token)은 JSON 포맷으로 데이터를 안전하게 전송하기 위한 개방형 표준이다.
주로 사용자 인증 및 권한 부여(Authorization)와 관련된 용도로 사용된다.
JWT는 주로 서버와 클라이언트 간에 정보를 안전하게 전달하기 위한 토큰으로 토큰은 헤더(Header), 페이로드(Payload), 서명(Signature)의 세 부분으로 구성되어 있다.
jwt의 형태는 보통 아래와 같은 형태로 구성되어 있고
<헤더>.<페이로드>.<서명>
실제 JWT의 예시로
eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9
.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MTYyMzkwMjJ9
.kHXj8x-4_lxVeq3a2Ykh6plgl5f4UbqRzptRT-Q0Ozc
이런식으로 구성되어 있음을 볼 수 있다
.을 구분자로해서 순서대로 헤더, 페이로드, 서명에 대한 코드임을 알수 있다.
그리고 각각의 구성에 대한 내용은 아래와 같다.
헤더 (Header):
- JWT의 첫 번째 부분으로, 토큰의 유형과 서명 알고리즘을 정의한다.
- 예를 들어, HS256(HMAC SHA-256)을 사용하여 서명할 수 있다.
{
"alg": "HS256",
"typ": "JWT"
}
페이로드 (Payload):
- 두 번째 부분은 실제 데이터가 들어가는 곳으로 주로 사용자의 정보를 담거나 인증 정보를 담는다. 예를 들어, 사용자 ID, 권한 정보 등이 포함된다.
- 클레임(Claims)이라는 이름의 정보들이 포함된다. 클레임은 JWT 내에서 전송되는 정보로 크게 세 가지 유형이 있다
- 등록된 클레임 (Registered Claims): 미리 정의된 클레임으로 iss(발급자), exp(만료 시간), sub(주제) 등.
- 공개 클레임 (Public Claims): 다른 시스템에서 사용할 수 있는 클레임.
- 비공개 클레임 (Private Claims): 발급자와 수신자 간에만 사용되는 클레임.
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
서명 (Signature):
- 서명은 토큰이 변경되지 않았는지 확인하는 데 사용된다. 서명은 헤더와 페이로드를 결합한 후, 비밀 키를 사용하여 생성한다.
- 이 서명은 토큰을 받은 측에서 토큰의 무결성을 확인하는 데 사용된다.
서명 생성 예시 (HS256 알고리즘)
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
이건 결국 클라이언트에서 header와 payload를 서버로 전달해주고 접근이 가능한 클라이언트라면 signature를 생성해서 jwt를 완성해서 응답으로 전달해주고 이때부터 클라이언트는 서버에 접근이 가능하도록 하는 과정을 가지게 된다.
이렇게 사용하는 것이 JWT이다.
'Programming Language > Node.js' 카테고리의 다른 글
Node.js로 웹 개발하기 - 02. Express.js (0) | 2024.12.28 |
---|---|
Node.js로 웹 개발하기 - 01. 웹 서버 만들기 (2) | 2024.12.26 |
TypeScript에 대한 간단한 정리 - 13. tsconfig.json의 구성 옵션 (0) | 2024.12.24 |
TypeScript에 대한 간단한 정리 - 12. 패키지의 타입 선언 (0) | 2024.12.24 |
TypeScript에 대한 간단한 정리 - 11. 제네릭 - 함수 / 클래스 / 인터페이스 (0) | 2024.12.23 |