스프링 시큐리티를 공부하기 앞서 보안과 관련된 개념을 정리하고자 한다. 목차는 다음과 같다.
- RSA 암호화
- 공개키와 개인키
- JWT에 대하여
- RFC?
- JWT 구
데이터를 전달할 때 발생하는 보안이슈를 해결하기 위해선 기밀성, 무결성, 가용성이 필요하고, 이를 위해서는 열쇠전달문제, 보낸사람 신뢰 문제를 해결해야 한다.
위같은 문제를 해결하기 위해 RSA 암호화를 한다!
1. RSA 암호화
RSA 암호화는 공개키 암호 방식 중 하나로, 암호화 뿐만 아니라 전자서명이 가능한 최초의 알고리즘이다. 이를 개발한 연구자들의 이름 앞글자를 따서 RSA가 되었다.
방식
RSA는 두 개의 키인 공개키와 개인키를 이용한다. 이때, 공개키는 누구에게나 공개해도 괜찮은 키로 메시지를 암호화할 때 사용되고, 이때 암호화 된 문서는 개인키를 이용해 복호화 할 수 있다. 그래서 개인키는 타인에게 공유되면 안 된다!
공개키로 암호화 된 문서는 개인키로 복호화 할 수 있고, 개인키로 암호화 된 문서 또한 공개키로 복호화 할 수 있다.
예시
A가 B에게 문서를 보내는 상황이라고 가정해보자.
만약 A의 공개키로만 암호화를 하여 문서를 보낸다면, 이를 복호화 하기 위해 B는 A의 개인키가 필요하다. 이러한 상황에서 A의 개인키를 보내게 되면 중간에 탈취당할 가능성이 높다.
그래서 A는 B만 문서를 열 수 있도록 B의 공캐키를 이용해 암호화를 하게 되었다. 해당 문서를 B에게 보내는데, 중간에 탈취를 당한다. 탈취한 사람은 해당 문서를 열 수는 없지만, 다른 문서로 바꿔치기 할 수 있다. B의 공개키는 누구나 알 수 있기 때문이다.
이 두가지 문제를 모두 피해가기 위해 RSA암호화는 먼저 A의 개인키로 문서를 잠군 후, B의 공개키로 한번 더 잠군다.
B가 문서를 받고 B의 개인키로 1차 복호화를 한다. 이후 A의 공개키로 2차 복호화를 하여 두 가지 문제를 모두 해결할 수 있다.
이 개념을 알고 JWT를 공부해보려고 한다.
2. JWT (Json Web Token)
JWT는 유저를 인증하고 식별하기 위한 토큰기반 인증으로, 정보를 Json 객체로 보낸다. JWT는 RFC7519 라고 하는데, 여기서 RFC는 무엇일까 ?
RFC
RFC는 인터넷을 개발하고 사용하기 위해 필요한 절차, 핵심 기술을 정의한 문서이다. 초기 인터넷을 연구할 때 기록해둔 문서이며 시간을 거듭할수록 많은 문서가 작성된 것이다.
JWT의 경우, 7519번쨰 문서인 셈이다.
JWT 구조
✅ 헤더 (Header)
헤더에는 키, 타입, 서명 암호화 알고리즘이 들어간다.
- 키 (kid) : 서명 시 사용하는 key (pub/pri)를 식별하는 값
- 타입 (typ) : 토큰 유형 ex| jwt
- 암호화 알고리즘 (alg) : 서명 암호화 알고리즘이 들어간다. HS256, HS512, RS256...
✅ 페이로드 (Payload)
토큰에서 사용할 정보 조각(클레임)이 들어있다. 이때 클레임은 key/value 형태의 값을 갖는다. 저장되는 정보에 따라 공개클레임, 비공개 클레임으로 구분된다.
- iss : 토큰 발급자 - PUB Claim
- sub : 토큰 제목 - PUB Claim
- iat : 토큰 발급 시간 - PUB Claim
- exp : 토큰 만료시간 - PUB Claim
- roles : 권한 - PRI Claim
✅ 서명 (Signiture)
Header에서 정의한 알고리즘을 이용해 < Header + Payload + 서버가 갖고있는 유일한 key 값 > 을 암호화 한 값이다.
이때 header와 payload 각각을 Base64Url로 인코딩해서 넣는다. 이는 쉽게 복호화가 가능하다! 이것들을 합친 것을 암호화 하는 것이다.
이렇게 암호화 한 서명(Sig)은 복호화 할 수 없다. 복호화 하는 것이 아니라, 클라이언트에서 서버에 요청이 왔을 때, 서버에서 직접 header와 payload, 고유 key값을 이용해 암호화를 하고, 값이 같은지 확인하는 과정을 거쳐 유효성을 확인한다.