JWT 토큰이란 ?
JWT(JSON Web Token)은 인터넷에서 정보를 안전하게 전송하기 위해 정의된 토큰임.
JWT는 JSON 형식으로 표현되며, 클라이언트와 서버 간의 인증 및 정보 교환에 사용됨.
주로 인증된 사용자의 세션 유지, API 요청의 권한 부여 등에 활용됨.
< JWT의 구성요소 >
1. Header
-> 토큰의 유형과 해싱 알고리즘 등의 메타데이터를 포함한다.
2. Payload
-> 토큰에 담길 정보가( 사용자 아이디, 권한 정보 등) JSON형태로 포함됨.
3. Signature
-> Header와 Payload를 인코딩하고, 서버가 발급한 비밀 키를 사용하여 서명한 값. 이것을 통해서 토큰 변조 여부를 확인할 수 있다 !
그럼 실제 토큰으로 더 자세히 알아보자 ~!!!!
이 토큰에서
붉은색은 헤더,
보라색은 페이로드,
하늘색은 시그니쳐라고 볼 수 있다.
Header
{
"alg": HS256",
"typ": "JWT"
}
alg는 해싱 알고리즘이며,
typ은 토큰의 유형을 말한다.
Payload
payload에는 다양한 값들이 담길 수 있다.
(나는 userId만을 설정하였고, iat, exp와 같이 토큰 발급시간 , 만료시간이 함께 저장된다)
Signature
secret key를 헤더에 지정된 알고리즘을 사용하여 해싱함.
그리고 해시값을 Base64로 인코딩하면 시그니처임.
< JWT 프로세스 >
(로그인 요청)
1. 아이디 , 비번을 입력하여 서버에 로그인 요청을 보냄.
2. 서버는 secret key를 사용하여 json객체를 암호화한 JWT 토큰을 발급함.
3. JWT를 클라이언트에 반환.
(로그인 이후)
1. 사용자는 로컬에 JWT를 저장해둠.
2. 사용자가 api를 호출할 때 마다 header에 JWT를 함께 넣어 요청한다.
3. 서버는 header의 JWT 토큰을 이용하여 인증된 사용자인지 확인한 후 응답을 보낸다.
https://jwt.io/
-> jwt 토큰의 구조를 확인할 수 있다.
로그인하여 토큰을 발급 받았다면 이곳에 입력해보자 !
토큰을 입력하고 우측 맨 아래칸에 secret 키를 입력하면
왼쪽 하단에 'Signature Verified'라고 뜬다 !
우측의 payload를 보면 토큰 생성시 삽입한 유저의 정보를 확인할 수 있다.
(보안이 중요한 정보는 넣으면 안됨)
여기서 질문이 생길 수 있다 !
한번 로그인 한 유저인데 왜 모든 api요청마다 header에 토큰을 넣어서 인증을 거쳐야 하는지?
번거롭다는 생각이 든다.
HTTP 특성을 생각해보면,
HTTP는 상태를 유지하지 않는 stateless,
한번 api 요청이 이루어 지고나면 연결이 끊어지는 Connectionless의 특징을 가진다.
한번 요청을 하고나면 그 연결이 끊어지기 때문에
다음 요청이 왔을때 이미 인증한 사용자인지 아닌지 구분이 안된다는 것.
그것이 매 api 요청마다 토큰 검증을 하는 이유이다.
'cs > 컴퓨터지식' 카테고리의 다른 글
애플리케이션 배포방식의 변화.. (0) | 2024.07.17 |
---|---|
인증(Authentication)과 인가(Authorization) (0) | 2024.07.16 |