JWT가 내 비밀을 지켜줄 수 있을까
Spring Security에 JWT를 적용하기 전,
암호화에 대한 간단한 개념 정리
session을 사용하면 서버가 여러 대일 경우 문제가 발생해서 유저를 식별하기 위한 다른 방법이 필요하다. 웹에서는 트랜스포트 계층에서 데이터가 도착한 것까지 확인하는 TCP 통신 방식을 사용하는데, 다른 사람이 열어볼 수 없는지(열쇠 전달의 문제), 누가 보냈는지가 확실한지(인증 문제)를 해결해야 보안의 3요소(CIA)를 지킬 수 있다. 이를 위해 고안된 것 중 하나가 비대칭키 알고리즘인 RSA이고, RFC7519에서 이 비대칭 알고리즘인 RSA나 대칭 알고리즘인 HMAC을 사용하여 정보를 교환하는 JWT가 약속되었다.
JWT의 이해를 돕기 위해
Session, TCP, CIA, RSA, RFC에 대해 알아보자.
통신에는 아래와 같이 OSI 7계층이 있다.
응용 계층: 롤, 스타 등 우리가 쓰는 것
프레젠테이션 계층: 암호화, 압축
세션 계층: 인증
트랜스포트 계층
네트워크 계층: IP, LAN
데이터링크 계층: IP로 공유기까지 갔으면 그 공유기를 쓰고 있는 누군가를 찾음
물리 계층: 광케이블
여기까지 보내면, 다시 위로 올라가며 데이터가 전달된다.
보안의 3요소
➤ 암호화
= 금고를 열쇠로 잠금
➤ 데이터가 변경되지 않아야 함
= 금고를 못 가져가게 붙여놓음
➤ 데이터를 지킬 수 있어야 함
= 금고를 보내는 사람, 받는 사람 모두 열쇠를 가지고 있어야하는데, 열쇠를 전달하는 과정에서 금고가 털릴 수 있음
금고를 안전하게 보내기 위해 열쇠로 잠근 후 전달해도 아래와 같은 두가지 문제가 발생할 수 있다.
- 열쇠 전달의 문제
열쇠가 있으면 위조는 할 수 없지만, 중간에 가로챈 후 새로운 문서를 만들어서 보낼 수 있다.- 인증 문제
문서가 누구로부터 왔는지 알아야 중간에 문서가 바뀌지 않았는지 확인할 수 있다.
위의 두가지 문제를 해결하기 위해 나온 암호화 방식이 RSA 암호이다.
RSA는 공개키 암호시스템의 하나이다.
RSA는 asymmetric algorithm으로,
** HMAC은 양쪽이 동일한 private key를 가진 symmetric algorithm이다.
- 열쇠 전달의 문제
➤ A가 B의 공개키로 암호화 해서 보내면 B의 개인키로만 메세지를 풀 수 있다.- 인증 문제
➤ A가 A의 개인키로 암호화해서 보내면 B는 A의 공개키로 메세지를 열어 볼 수 있다.
➤ 메세지를 쓴 사람이 A가 맞다는 걸 인증해 줌으로 전자문서의 서명, 인증 역할을 한다.
이 RSA 방식을 활용한 암호화 토큰이 JWT이다.
https://jwt.io/introduction 에 가면 JWT 소개가 나온다.
What is JSON Web Token?
JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object.
RFC 7519는 통신을 하기 위한 약속 문서이다.
RFC1, RFC2, .... RFC7519에서 JWT가 약속되었다.
Header: 알고리즘, 타입
Payload: 전달할 내용
Signature: 개인키; header와 payload를 base64(암호화, 복호화 가능)로 암호화한 후 secretKey와 함께 HS256으로 암호화
각각은 .으로 연결되어 JWT token이 생성된다.
위와 같이 생성된 JWT 토큰을 웹 브라우저의 로컬 스토리지에 저장한다.
그 이후 요청시 해당 JWT 토큰과 요청 내용을 함께 보내면, 서버가 유효한 토큰인지 검증한 후 요청에 응답한다.
session을 사용하면 서버가 여러 대일 경우 문제가 발생해서 유저를 식별하기 위한 다른 방법이 필요하다. 웹에서는 트랜스포트 계층에서 데이터가 도착한 것까지 확인하는 TCP 통신 방식을 사용하는데, 다른 사람이 열어볼 수 없는지(열쇠 전달의 문제), 누가 보냈는지가 확실한지(인증 문제)를 해결해야 보안의 3요소(CIA)를 지킬 수 있다. 이를 위해 고안된 것 중 하나가 비대칭키 알고리즘인 RSA이고, RFC7519에서 이 비대칭 알고리즘인 RSA나 대칭 알고리즘인 HMAC을 사용하여 정보를 교환하는 JWT가 약속되었다.
다음으로 Spring Security에 JWT를 적용해보자!