티스토리 뷰
해싱
- 해싱은 민감한 데이터를 다루어야 하는 상황에서 데이터 유출의 위험성은 줄이면서 데이터의 유효성을 검증하기 위해서 사용되는 단방향 암호화 방식입니다.
- 해싱은 가장 많이 쓰이는 암호화 방식 중 하나로, 복호화가 가능한 다른 암호화 방식들과 달리 암호화만 가능합니다
- 해싱은 해시 함수(Hash Function)를 사용하여 암호화를 진행하는데, 이러한 해시 값은 원래 데이터를 나타내는 고유한 디지털 지문으로 사용될 수 있습니다.
- 해시 함수 항상 같은 길이의 문자열을 리턴하고, 서로 다른 문자열에 동일한 해시 함수를 사용하면 다른 결과값이 나옵니다.
- 단, 동일한 문자열에 동일한 해시 함수를 사용하면 항상 같은 결과값이 나오기에, 해싱한 값이 이전에 기록된 값인 경우 보안상의 위험이 생길 수 있습니다.
- 이를 해결하기 위한 것이 솔트로, 해싱 이전 값에 임의의 값을 더해 데이터가 유출되더라도 해싱 이전의 값을 알아내기 어렵게 만듭니다.
- 해싱은 빠르고 효율적인 데이터 검색을 위해 많이 사용되며, 보안 분야에서는 암호화와 인증 등에도 사용됩니다.
토큰
- 웹 보안에서의 토큰은 보통 인증과 권한 정보를 해싱한 암호화된 문자열을 의미합니다
- 토큰은 인증된 사용자만이 접근 가능한 서비스나 데이터를 이용할 때, 해당 사용자를 식별하기 위한 일종의 인증 수단입니다.
- 토큰은 유저의 인증 상태를 클라이언트에 저장하며, 서버에 저장하는 세션 인증 방식보다 서버의 부하나 메모리 부족 문제를 줄일 수 있습니다.
- 상태를 클라이언트에 저장하기에 쿠키와 함께 자주 쓰이며, HTTP의 무상태성을 보완해주기도 합니다.
- 또한, 토큰은 다수의 서버가 공통된 세션 데이터를 가질 필요가 없어, 서버를 확장하기 더 용이합니다.
- 토큰의 생성과 검증이 하나의 서버에서 이루어지지 않아도 되기 때문에 토큰 생성만을 담당하는 서버를 구축할 수 있어, 여러 서비스 간의 공통된 인증 서버를 구현할 수 있습니다.
- 토큰은 인증 상태, 접근 권한 등 다양한 정보를 담을 수 있기 때문에 사용자 권한 부여에 용이하며, 어드민 권한 부여 및 정보에 접근할 수 있는 범위도 설정할 수 있습니다.
토큰 인증 방식의 흐름
1. 사용자가 인증 정보를 담아 서버에 로그인 요청을 보냅니다.
2. 서버는 데이터베이스에 저장된 사용자의 인증 정보를 확인합니다.
3. 인증에 성공했다면 해당 사용자의 인증 및 권한 정보를 서버의 비밀 키와 함께 토큰으로 암호화합니다.
4. 생성된 토큰을 클라이언트로 전달합니다.
- HTTP 상에서 인증 토큰을 보내기 위해 사용하는 헤더인 Authorization 헤더를 사용하거나, 쿠키로 전달하는 등의 방법을 사용합니다.
5. 클라이언트는 전달받은 토큰을 저장합니다.
- 저장하는 위치는 Local Storage, Session Storage, Cookie 등 다양합니다.
6. 클라이언트가 서버로 리소스를 요청할 때 토큰을 함께 전달합니다.
- 토큰을 보낼 때에도 Authorization 헤더를 사용하거나 쿠키로 전달할 수 있습니다.
7. 서버는 전달받은 토큰을 서버의 비밀 키를 통해 검증합니다. 이를 통해 토큰이 위조되었는지 혹은 토큰의 유효 기간이 지나지 않았는지 등을 확인할 수 있습니다.
8. 토큰이 유효하다면 클라이언트의 요청에 대한 응답 데이터를 전송합니다.
JWT
- JWT는 토큰 기반 인증 구현 시 대표적으로 사용하는 기술로, JSON 객체에 정보를 담고 이를 토큰으로 암호화하여 전송할 수 있는 기술입니다.
- 클라이언트가 서버에 요청을 보낼 때, 인증정보를 암호화된 JWT 토큰으로 제공하고, 서버는 이 토큰을 검증하여 인증정보를 확인할 수 있습니다.
- JWT는 다음 그림과 같이 .으로 나누어진 세 부분이 존재하며 각각을 Header, Payload, Signature라고 부릅니다.
Header
- Header에는 마치 HTTP의 헤더처럼 해당 토큰 자체를 설명하는 데이터가 담겨 있습니다.
- 토큰의 종류, 그리고 시그니처를 만들 때 사용할 알고리즘을 JSON 형태로 작성합니다.
Payload
- Payload는 HTTP의 페이로드와 마찬가지로 전달하려는 내용물을 담고 있는 부분입니다.
- 어떤 정보에 접근 가능한지에 대한 권한, 유저의 이름과 같은 개인정보, 토큰의 발급 시간 및 만료 시간 등의 정보들을 JSON 형태로 담습니다
Signature
- Signature는 토큰의 무결성을 확인할 수 있는 부분입니다.
- Header와 Payload를 서버의 비밀 키(salt)와 합치고, 이를 Header에서 지정한 알고리즘을 사용하여 해싱합니다.
토큰의 한계
- 토큰은 상태를 클라이언트에 저장하고, 인증 상태를 관리하는 주체가 서버가 아니므로, 토큰이 탈취되어도 해당 토큰을 강제로 만료시킬 수 없습니다.
- 따라서 토큰이 만료될 때까지 사용자로 가장해 계속해서 요청을 보낼 수 있습니다.
- 이를 해결하기 위해, 토큰이 탈취되는 상황을 대비해서 유효 기간을 짧게 설정하면 좋지 않은 사용자 경험을 제공합니다.
- 또한, 토큰에 여러 정보를 담을 수 있는 만큼, 많은 데이터를 담으면 그만큼 암호화하는 과정도 길어지고 토큰의 크기도 커지기 때문에 네트워크 비용 문제가 생길 수 있습니다.
- 이러한 요인 때문에 토큰에는 인증을 위해 최소한의 값만 넣고,비밀번호 같은 민감한 정보는 담지 않습니다.
'개발 > node, express' 카테고리의 다른 글
OAuth (0) | 2023.05.04 |
---|---|
액세스 토큰과 리프레시 토큰 (0) | 2023.05.03 |
세션 (0) | 2023.05.02 |
쿠키 (0) | 2023.05.02 |
HTTPS 구현 (0) | 2023.05.02 |
댓글