Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- docker
- 3D
- Token인증방식
- Jenkins
- OnlineIDE
- 3d프린터 초보
- kubernetes
- 리눅스 파일동기화
- nas
- github
- C언어
- Kotlin
- docker container
- NAS HDD교체
- octoprint
- 3D 프린터 용어
- git
- gitlab
- IoTNetwork
- 3D프린터 입문
- ci/cd
- 3D프린터입문
- 3D모델링
- 데이터 직렬화 포맷
- 네이버클라우드
- 코틀린개발환경
- linux job
- data serialization formats
- Notification
- 3D프린터
Archives
- Today
- Total
0과 1을 공부하다.
[Web] JWT Web Token 기초 본문
728x90
JWT Token 이란?
- JWT( JSON Web Token)은 웹 표준 (RFC 7519) 으로 정의되어 있는 웹 토큰 기술의 하나로, 정보를 안전하게 전달하기 위해 사용되는 컴팩트하고 자가수용적인 방식의 토큰이다. 주로 인증을 관리하기 위해 사용된다.
- 세션과 비교하여 가장 큰 장점은 무상태(Stateless) 라는 점이다. 세션과 다르게 JWT 토큰 인증 방식은 상태를 저장하지 않고 토큰 자체로 인증을 수행하기 때문에 상태 접근을 위한 부하를 줄일 수 있다.
인증(Authentication): 접근자가 누구인지 확인하는 절차
인가(Authorization): 인증을 마친 접근자에게 권한을 허락하는 절차
JWT Token 구조 및 동작 방식
- JWT는 Header, Payload, Signature 를 각각 ‘.’ 으로 구분하여 Base64로 인코딩한 문자열이다.
- JWT.IO 에서 JWT의 Encode / Decode 결과를 확인 할 수 있다.
1. Header
- 토큰의 헤더는 typ과 alg 두 가지 정보로 구성되며, JSON 포맷으로 지정한다.
- typ: 토큰의 타입을 지정한다. (JWT 고정)
- alg: 해싱 알고리즘을 지정한다. 해싱 알고리즘으로는 보통 HMAC SHA256 혹은 RSA 가 사용되며, 토큰 검증 과정에서 사용되는 signature에서 사용된다.
{
"typ": "JWT",
"alg": "HS256"
}
2. Payload
- 토큰에 사용할 정보의 조각들인 클레임(Claim)을 JSON 포맷으로 담는다.
- Payload는 앞서 기술한 바와 같이 Base64으로 인코딩된 평문 데이터로 쉽게 조회가 가능하다. PW와 같은 민감정보는 담지 않도록 주의한다. (만약 필요하다면 해싱 또는 암호화 하여 포함)
- 등록된 클레임(Registerd Claim)
- 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터로 선택적으로 지정한다.
- Key의 길이는 간결하게 3자로 이뤄져 있으며, RFC 7519: JSON Web Token (JWT)에서 등록된 클레임 정보를 확인할 수 있다.
- 대표적인 예로 토큰 발급자(iss), 토큰 제목(sub), 토큰 대상자(aud), 토큰 만료시간(exp), 토큰 활성 시간(nbf), 토큰 발급 시간(iat), 토큰 식별자(jti)가 있다.
- 공개 클레임(Public Claim)
- 사용자 정의 클레임으로, 공개용 정보를 위해 사용되며, 충돌 방지를 위해 Key 값으로 URI 포맷을 사용한다.
{
" http://test.co.kr?ts=777&language=KR&page=1&pagesize=15 ":true
}
- 비공개 클레임(Private Claim)
- 사용자 정의 클레임으로, 서버와 클라이언트 사이에 임의로 지정한 Key 값을 지정한다.
{
"team":"hr",
"group":"admin"
}
3. Signature
- 서명(Signature)은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다.
- 앞서 생성한 Header, Payload를 Base64로 인코딩하고 '.'을 구분자로 하여 합쳐 문자열을 생성한다.
- 생성한 문자열을 Secret Key로 해싱하고 Base64로 인코딩한다.
- 위와 같은 절차로 생성된 Signature는 특정 토큰을 입력받았을 때 동일한 절차를 통해 Header 또는 Payload 가 위변조 되었는지 확인하여 무결성을 확보할 수 있게 된다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
Access / Refresh Token
- JWT 토큰방식의 가장 큰 단점은 한 번 발행한 토큰은 만료되기 이전까지 강제로 만료시킬 수 없다는 점이다.
- 이를 해결하기 위해 비교적 짧은 Access Token과 비교적 긴 Refresh Token을 발행하여 단점을 보완한다.
- 보편적으로 사용하는 Access Token과 Refresh Token을 이용한 인증 절차는 아래와 같다.
1. 클라이언트는 사용자를 식별할 수 있는 정보(ID,PW 등)를 담아 API Server에 인증 요청한다. 2. 서버는 유효한 사용자인지 확인하고 Access Token과 Refresh Token을 발행하여 클라이언트에게 응답한다. 이때 Refresh Token은 DB 또는 스토리지에 저장한다. 3. 클라이언트가 API를 통해 데이터를 요청 할 때 Access, Refresh Token을 함께 보낸다. (Access만 보내고 만료시 Refresh를 보내는 로직으로도 구현 가능) 4. Access 토큰이 만료되었다면 함께 전달한 Refresh Token의 유효성 검증을 하고 서버상에 저장한 Refresh Token과 일치하는지 확인한다. 일치한다면 새로운 Access Token과 Refresh Token을 반환한다.5. Refresh Token이 만료되었다면 클라이언트에게 오류 메세지를 응답한다. |
- Access Token과 Refresh Token을 동시에 사용하면 Access Token 탈취되더라도 비교적 짧은 시간으로 만료되면 다시 갱신하여 발급받을 수 없게 되며, 만약 Refresh Token이 탈취 되더라도 Token을 무효화하여 피해를 최소화할 수 있다.
장점 및 단점
장점
- 간결하고 자가수용적(Self-Contained)
- JWT는 필요한 사용자 정보와 권한을 포함하는 JSON 형식의 토큰이며, 토큰 자체가 사용자 정보를 포함하므로 별도의 서버 상태를 유지하지 않아도 된다.
- 분산 시스템에 적합
- JWT는 분산된 서비스 및 마이크로서비스 아키텍처에서 유용하다.
- 각 서비스가 토큰을 검증하기만 하면 되므로 중앙 집중식 인증 서버가 필요하지 않다.
- 확장 가능성
- JWT는 사용자 정의 클레임(claims)을 지원하여 필요한 사용자 정보를 토큰에 추가할 수 있으며, 추가적인 데이터를 토큰에 넣어서 확장성을 확보할 수 있다.
- 성능
- JWT는 서명된 토큰을 사용하므로 클라이언트 및 서버 간의 통신에서 빠른 인증을 제공한다.
단점
- 토큰 크기
- JWT는 토큰에 정보를 포함하므로 토큰 크기가 크게 될 수 있다.
- 이로 인해 네트워크 대역폭을 소비하고 저장 공간을 차지할 수 있다.
- 무효화 및 갱신 어려움
- JWT는 발급된 후에는 내부 정보를 수정할 수 없으며, 만료 시간을 갱신하기 어려울 수 있다.
- 만료된 토큰은 적법한 절차로 다시 발급해야 한다.
- 중요 정보 노출 위험
- JWT는 기본적으로 토큰 내용을 볼 수 있기 때문에 중요한 정보가 노출될 경우 보안 문제가 발생할 수 있다.
- 민감한 데이터는 반드시 암호화되어야 한다.
- 세션 관리 어려움
- JWT는 자체적인 세션 관리 기능을 가지고 있지 않으므로 로그아웃 또는 세션 무효화와 같은 작업을 처리하기 어렵다.
- 이를 해결하려면 추가적인 관리(상태를 저장하는 DB 이용 등)가 필요하다.
참고 사이트
[1] JWT - refresh,access 토큰 정리
https://pizza7311.me/post/dev/refresh-and-access-token
[2] JWT의 개념과 다양한 구현방법들
[3] Access Token & Refresh Token
[4] [Spring] jwt란 - jwt 내부구조, 동작과정, 스프링에서 파싱하기
https://thalals.tistory.com/352
[5] [Java] Spring Boot Security 이해하기 -3: JWT(JSON Web Token) 이해하기
[6] 직접 만들어보며 이해하는 JWT
https://hudi.blog/self-made-jwt/
※ 본 게시글의 정보가 잘못 되었거나 부족한 부분에 대한 피드백을 환영합니다.
* CopyRight 2023. Jay Park All rights reserved.
728x90
'Study > Web' 카테고리의 다른 글
[DB] Redis DB 기초 (0) | 2023.09.13 |
---|---|
[Laravel] Laravel 프로젝트에 Swagger 적용 (0) | 2023.02.13 |
[Laravel] Laravel 형상관리 (0) | 2022.10.27 |
[Laravel] Eloquent Model 작성 (0) | 2022.10.13 |
[Laravel] Laravel 설치 및 개요 (0) | 2022.10.13 |
Comments