일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 엘라스틱서치
- 하이브리드접근법
- 티스토리챌린지
- STOMP
- 헥사고날아키텍처
- 캐시의 작동 원리
- kafka배포
- 한화시스템부트캠프
- 프로세스와스레드의차이
- 오블완
- nplus1
- n8n
- 프로토콜역할
- QA
- 자동화워크플로우
- JPA
- XSS
- 자바
- springboot
- Java
- N+1문제
- 메소드
- Kafka
- jwt토큰
- 스프링시큐리티
- 자료구조
- selenium
- 부트캠프
- 테스트케이스
- 오버로딩
- Today
- Total
아쿠의 개발 일지
[Security] JWT(JSON Web Token)토큰이란? 본문
오늘은 JWT 토큰 관련해서 공부를 해보았고, 그를 정리해 보려고 합니다.
정리하기 전, 애플리케이션을 개발하다 보면 인증과 인가 등의 보안 기능을 추가해야 할 때가 있습니다.
스프링에 보안을 적용할 때 사용하는 Spring Security에 대해서 용어 이해하고 이어가도록 하겠습니다.
1. 인증(authentication)
사용자가 누구인지 확인하는 단계를 의미합니다. 인증의 대표적인 예로는, 로그인이 있습니다.
로그인은 DB에 등록된 ID,PW를 사용자가 입력한 ID,PW와 비교해서 일치 여부를 확인하는 과정입니다.
로그인에 성공하면 애플리케이션 서버는 응답으로 사용자에게 Token을 전달합니다.
로그인에 실패한 사용자는 Token을 전달받지 못해, 원하는 리소스에 접근할 수 없게 됩니다.
2. 인가(authorization)
인가는 인증을 통해 검증된 사용자가 애플리케이션 내부의 리소스에 접근할 때 사용자가 해당 리소스에 접근할 권리가 있는지 확인하는 과정입니다.
예를 들어, 로그인한 사용자가 특정 게시판에 접근해서 글을 보려고 하는 경우 게시판 접근 등급? 등을 확인해 접근을 허가 하거나, 거부하는 것이 대표적인 인가 사례입니다.
일반적으로 사용자가 인증 단계에서 발급받은 토큰은 인가 내용을 포함하고 있으며, 사용자가 리소스에 접근하면서 토큰을 함께 전달하면 애플리케이션 서버는 토큰을 통해 권한 유무 등을 확인해 인가를 수행합니다.
스프링 시큐리티는 애플리케이션의 인증, 인가 등의 보안 기능을 제공하는 스프링 하위 프로젝트 중 하나입니다.
보안과 관련된 많은 기능을 제공하기 때문에 스프링 시큐리티를 활용하면 더욱 편리하게 원하는 기능을 설계할 수 있습니다.
스프링 시큐리티는 서블릿 필터를 기반으로 작동하며, Dispatcher Servlet 앞에 배치되어 있습니다.
필터체인은 서블릿 컨테이너에서 관리하는 ApplicationFilterChain을 의미합니다.
클라이언트에서 애플리케이션으로 요청을 보내면, 서블릿 컨테이너는 URI를 확인해서 필터와 서블릿을 매핑합니다.
이를 활용한 인증 수행 과정은 다른 장에 따로 정리 후, 링크 첨부하도록 하겠습니다.
이제 인증과 인가에 대해서 말씀 드렸으니, JWT 토큰을 사용해 인증을 수행할 예정입니다.
JWT(JSON Web Token) ?
JWT(JSON Web Token)은 클라이언트와 서버 간에 정보를 안전하고 효율적으로 교환하기 위해 사용되는 JSON 기반의 토큰 형식입니다.
JWT는 간결하면서도 자체적으로 정보의 무결성을 보장하는 특징이 있습니다. 주로 인증 및 권한 부여를 위한 목적으로 많이 사용됩니다.
주로 서버와의 통신에서 권한 인가를 위해 사용됩니다. URL에서 사용할 수 있는 문자열로만 구성되어 있기 때문에 HTTP 구성요소 어디든 위치할 수 있습니다.
1. 헤더
JWT의 헤더는 검증과 관련된 내용을 담고 있습니다.
두 가지 정보를 포함하고 있는데 바로, alg와 typ 속성입니다.
{
"alg" : "HS256",
"typ" : "JWT"
}
alg 속성에서는 해싱 알고리즘을 지정합니다. 해싱 알고리즘은 보통 SHA256 또는, RSA를 사용하며, 토큰을 검증할 때 사용되는 서명 부분에서 사용됩니다.
HS256은 HMACSHA256을 사용한다는 의미입니다.
그리고 typ 속성에서는 토큰의 타입을 지정합니다.
2. 내용
JWT의 내용에는 토큰에 담는 정보를 포함합니다.
이곳에 포함된 속성들은 클레임이라 하며, 크게 세 가지로 분류됩니다.
- 공개 클레임
- 등록된 클레임
- 비공개 클레임
등록된 클레임은 필수는 아니지만 토큰에 대한 정보를 담기 위해 이미 이름이 정해져 있는 클레임을 뜻합니다.
- iss : JWT의 발급자, 주체를 나타냅니다.
- sub : JWT의 제목입니다.
- aud : JWT의 수신인입니다. 처리하려는 각 주체는 해당 값으로 자신을 식별해야 합니다.
- exp : JWT의 만료시간입니다.
- ndf : Not Before
- iat : JWT가 발급된 시간입니다.
- jti : 식별자입니다.
공개 클레임은 키 값을 마음대로 지정할 수 없습니다.
비공개 클레임은 통신 간에 상호 합의되고 등록된 클레임과 공개된 클레임이 아닌 클레임을 의미합니다.
3. 서명
JWT의 서명 부분은 인코딩된 헤더, 인코딩된 내용, 비밀키, 헤더의 알고리즘 속성값을 가져와 생성됩니다.
예를 들어 HMAC SHA256 알고리즘을 사용해서 서명을 생성할 수 있습니다.
서명은 토큰의 값들을 포함해서 암호화하기 때문에 메시지가 도중에 변경되지 않았는지 확인할 때 사용됩니다.
JWT 토큰의 개념, 작동 원리 등을 알아볼 수 있었습니다.
JWT는 간편성과 강력한 보안 기능으로 인해 현대 웹 개발에서 필수적인 도구로 자리하고 있습니다.
다들 안전한 인증 시스템을 구축하시고, 향상된 보안을 제공할 수 있길 바랍니다. 아자아자. 👍
'Programming > CS' 카테고리의 다른 글
운영체제(Operating System)의 핵심 개념 (0) | 2025.01.14 |
---|---|
[Network] SSL 인증서 적용 & K8S 클러스터 Ingress-nginx 활용 (0) | 2025.01.08 |
[Network] HTTP/HTTPS 차이점, SSL 인증서 다운로드 받기 (4) | 2025.01.07 |
[Security] UsernamePasswordAuthenticationFilter 인증 과정 (1) | 2025.01.02 |
[OOP] 디자인 패턴(Design Pattern)? (0) | 2024.12.30 |