양방향 알고리즘
암호화된 암호문을 복호화 할 수 있다.
알고리즘: 대칭키 방식, 비대칭키 방식
단방향 알고리즘
암호화 하되 복호화는 할 수 없다.
알고리즘: Hash 방식
HASH는 단방향 암호임. MD5, SHA 등의 해쉬 함수가 있음. 근데 MD5, SHA-1, HAS-180은 보안이 뚫렸기 때문에 SHA-256, 512를 써야 함.
참고로 안좋은 HASH는 중복이 있기 때문에 중복이 적을수록 좋은 해시임.
보안을 더 철저히 하려면 salt값을 적용하는 방법 또는 Hash 함수를 여러번 돌리는 방법 등이 있음.
여튼 개발자는 어떤걸 잘 쓰면 될지를 알면됨
pbkdf2 : 솔트값과 해시함수의 반복횟수등을 지정할 수 있다.
bcrypt : 패스워드를 위해 탄생해서 아주 강력한 해시 알고리즘이 적용됨. 마찬가지로 검색해서 사용 (Spring security에서 사용함)
대칭키 방식
암호화/복호화 시 동일한 키를 사용한다.
키는 비공개
속도가 빠르다
키 노출 우려 있다
DES
AES(취약점 보안을 많이 하여 안정성이 높다?)
비대칭키 방식
암호화/복호화 시 다른 키를 사용한다.
하나의 키는 공개키, 나머지 하나는 비공개(=대칭키)
키 안정성이 높다
상대적으로 느리다
RSA (디지털 서명)
키1, 키2라고 했을 때, 키1로 암호화 한 암호문은 키2로만 복호화 할 수 있고, 키2로 암호화 한 암호문은 키1으로만 복호화 할 수 있다.
중간자 공격(MITM: Man In The Middle Attack)에는 취약하단다.
(중간에서 통신을 가로채어 수신자에게 송신자인척 하면서 대칭키까지 얻어냄..)
** 비대칭키 사용? TLS(Transport Layer Secure)에서 씀. RSA알고리즘 일듯.
참고: https://jeong-pro.tistory.com/92
JWT
Base64 URL-Safe 인코딩된 문자열(ASCII 로 변환해줌. 그냥 ASCII로 변환하면 플랫폼별로 8비트중 1비트 처리 방식이 다른 경우가 있어서 안좋은 모양)
ES256(키 생성 알고리즘으로 ECDSA(Elliptic Curve Digital Signature Algorithm, 타원곡선 디지털 서명 알고리즘) 중 하나인 ES256(P-256 + SHA256)을 사용한다. 블록체인에서 사용하는 알고리즘인데, JWT에서도 많이 사용하는 알고리즘인 것 같다.)
(SHA-256만 쓰면 단방향 암호화이기 때문에 위 알고리즘을 더 많이 쓰는 듯하다.)
JWT in MSA
1. Access Token
일반적으로 권한 제어가 필요한 웹 서비스는 로그인을 통해 사용자 인증(Authentication)을 진행한다.
액세스 토큰(Access Token)을 발급한다.
참조 토큰(By Reference Token)이라 부른다.
모놀리스(Monolith) 아키텍처에서는 참조 토큰을 액세스 토큰으로 사용해도 큰 문제가 없다.
하지만 수많은 서비스 간 API 호출이 발생하는 MSA(Micro Service Architecture) 환경에서는 모든 서비스들이 권한 서비스와 통신을 해야 한다.
권한 서버가 받는 부하는 늘어날 수 있다.
확장성(Scalability)에 부담을 줄 수 있다.
2. JWT
참조 토큰 대신 JWT를 액세스 토큰으로 사용할 수 있다.
JWT는 자체적으로 필요한 정보를 모두 담을 수 있기 때문에 값 토큰(By Value Token)이라 한다.
MSA 환경의 인증과 접근 제어에 적합하다.
서비스는 JWT에 포함된 값을 기준으로 권한을 확인할 수 있다.
서비스와 권한 서비스의 통신은 JWT 서명을 인증하기 위한 공개 키를 조회하는 게 전부다.
단점으로는 사용자에 대한 권한이나 정보가 변경되는 경우 JWT를 새로 발급해야 하며, 경우에 따라 JWT의 크기가 커질 수 있다.
그리고 JWT의 헤더나 페이로드는 디코딩(Decoding)하면 바로 내용을 확인할 수 있기 때문에 JWT의 모든 값들은 클라이언트에게 공개된다.
외부에 노출되어서는 안되거나 민감한 값이 노출될 수 있어 보안 문제로 이어질 수 있는 단점이 있다.
클라이언트, 권한 서비스, 서비스 사이에 API Gateway를 위치시키면 JWT를 클라이언트에게 숨기면서 서비스간 통신 시 사용할 수 있다.
API Gateway는 클라이언트에게 받은 액세스 토큰을 권한 서비스를 통해 JWT로 받아 액세스 토큰 대신 서비스로 넘겨준다.
spring filter, security, 좋은 글
'프로그래밍 > Web programming' 카테고리의 다른 글
REST 기반의 간단한 분산 트랜잭션 구현 - 1편 (퍼옴) (0) | 2019.04.29 |
---|---|
OWASP Top 10 (0) | 2019.04.15 |
connection/read timeout (0) | 2019.04.02 |
TCP/IP & TCP & UDP (0) | 2019.04.02 |
Cache (1) | 2019.03.21 |