이번에 프로젝트를 회원 파트를 맡으면서 JWT, Redis, OAuth에 관해 알게 되었다.
JWT 같은 경우는 회원과 관리자를 나누기 위한 방법을 찾아보다가 알게 되었다.
그 중에서 JWT 에 먼저 자세히 정리해보려고 한다.
JWT(JSON Web Token)
웹 토큰 기반 인증 시스템에서 사용하는 대표적인 표준 방식 중 하나로, JSON 형태로 인코딩된 토큰으로 사용자가 로그인한 후 서버로부터 전달받아 인증정보를 클라이언트 측에서 전송하는 방식이다.
토큰은 크기가 작고 URL 안전으로 설계되어 있으며 특히 웹 브라우저 통합 인증(SSO) 컨텍스트에 유용하다.
JWT 클레임은 아이덴티티 제공자와 서비스 제공자 간의 인가된 사용자의 아이덴티티를 전달하기 위해 보통 사용할 수 있다.
JWT는 Base64 URL-Safe 인코딩 방식을 사용하여, HTTP 헤더와 POST 요청 파라미터 등 모든 곳에서 사용 가능하며, 비교적 간단한 구조와 널리 사용되는 표준화된 방식으로 인해 많은 언어와 플랫폼에서 지원된다.
구조
헤더: 암호화 알고리즘과 토큰 타입 등이 담겨있다.
{ "alg" : "HS256", "typ" : "JWT" }
서명 생성을 위해 어느 알고리즘을 사용할지 식별한다.
HS256 은 이 토큰이 HMAC-SHA256을 사용하여 서명됨을 의미한다.
일반적으로 쓰이는 암호화 알고리즘들은 SHA-2(HS256) 방식의 HMAC와 SHA-256(RS256) 방식의 RSA 서명이다
- 페이로드(Payload): 사용자 정보와 추가적인 정보가 담겨있다.
{
"loggedInAs" : "admin",
"iat" : 1422779638
}
일련의 클레임을 포함한다,
JWT 사양은 토큰에 일반적으로 포함되는 표준 필드인 7개의 등록 클레임 이름을 정의한다.
- 서명(Signiture): 발급자가 발생한 JWT의 유효성 검증하기 위한 암호화된 문자열이다.
HMAC-SHA256(
secret,
base64urlEncoding(header) + '.' +
base64urlEncoding(payload)
)
토큰을 안전하게 확인한다. 서명은 Base64url 인코딩을 이용하여 헤더와 페이로드를 인코딩하고 이 둘을 점(.) 구분자로 함께 연결시킴으로써 계산된다.
이 세 부분은 Base64url 인코딩을 사용하여 별도로 인코딩되며 JWT 생성을 위해 점(.)을 사용하여 연결된다.
token = base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature)
이와 같은 데이터가 "secretkey" 시크릿키는 토큰을 생성한다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN\_oWnFSRgCzcmJmMjLiuyu5CSpyHI
이 결과가 되는 토큰은 HTML 과 HTTP로 쉽게 파싱 가능하다.
정리하면 JWT 인증 과정은 다음과 같다.
- 클라이언트에서 로그인하여 JWT 토큰을 발급받는다.
- 발급된 JWT 토큰을 HTTP 헤더에 담아 서버에 요청한다.
- 서버에서는 JWT 토큰을 검증하여 인증을 수행한다.
장점
- 서버의 부담이 줄어든다.(서버에 별도의 인증 정보 저장이 필요 없기 때문)
- 분산 환경에서 인증을 관리할 수 있어 유용
- 용량이 작고 전송속도가 빠르며, 보안적인 측면에서 유리(데이터가 Base64 URL-Safe 인코딩되어 전송되므로)
조심해야 할 부분
- JWT를 사용하면 토큰의 만료 시간을 미리 정해둘 수 밖에 없기 때문에 만료시간을 잘 못 지정할 경우 보안 문제가 발생할 수 있다.
- 정보가 모두 토큰에 담겨 있기 때문에 정보가 변조될 위험이 존재한다. -> 암호화된 HTTPS 프로토콜을 사용하거나 추가적인 보안 처리가 필요하다.
보안 해결방법
JWT 를 사용할 때 보안성을 높이기 위해서 리프레시 토큰을 사용하는 것이 좋다.
리프레 토큰(Refresh Token)은 일정 기간이 지난 후에도 유효한 장기간 토큰으로, 유효기간이 지난 토큰을 갱신하는 역할을 한다.
이를 통해 만료된 토큰으로 인한 보안 위험을 최소화할 수 있다.
또한, JWT를 안전하게 사용하기 위해서는 토큰 내에 저장되는 정보를 최소화하고, 중요한 정보는 암호화를 해야 한다.
참조: 위키
다음에는 Redis 에 대해 정리해 봐야겠다.
'Spring' 카테고리의 다른 글
OAuth (0) | 2023.05.06 |
---|---|
Redis (0) | 2023.05.05 |
TDD 란? (0) | 2023.02.23 |
[Spring] ORM 과 JPA (0) | 2023.01.02 |
[Spring] AOP란? (0) | 2022.12.16 |