Notice
Recent Posts
Recent Comments
Link
개발 무지렁이
[Essential Concepts] 쿠키를 쓰지 않는 클라이언트의 HTTP 요청이 있는 경우, DB를 거치지 않은 인증처리를 위한 JWT(Json Web Token) 본문
Backend/백엔드 필수개념
[Essential Concepts] 쿠키를 쓰지 않는 클라이언트의 HTTP 요청이 있는 경우, DB를 거치지 않은 인증처리를 위한 JWT(Json Web Token)
Gaejirang-e 2023. 9. 24. 12:27
𐂂 인증(Authentication)과 인가(Authorization)
🪤 인증이란
: 시스템이 제공한 신원을 확인하는 프로세스를 말한다.
🪤 인가란
: 인증된 개체가 어떤 작업을 수행할 권한이 있는지를 결정하는 프로세스를 말한다.
: 시스템이 제공한 신원을 확인하는 프로세스를 말한다.
🪤 인가란
: 인증된 개체가 어떤 작업을 수행할 권한이 있는지를 결정하는 프로세스를 말한다.
🌱 Spring Boot는 HTTP or HTTPS 요청이면 클라이언트가 뭐든간(?) 상관없이 요청을 처리한다.
클라이언트가 웹 브라우저인 경우, 브라우저 안의 🍪쿠키가 전달되어 인증 및 인가처리를 하는데,
클라이언트가 웹 브라우저가 아닌경우, 🍪쿠키를 잘 쓰지 않는다.
🍪쿠키를 쓰지 않으면 서버의 세션도 못쓴다.
* 이럴때 인증 및 인가를 어떻게 처리할까? *
클라이언트가 웹 브라우저인 경우, 브라우저 안의 🍪쿠키가 전달되어 인증 및 인가처리를 하는데,
클라이언트가 웹 브라우저가 아닌경우, 🍪쿠키를 잘 쓰지 않는다.
🍪쿠키를 쓰지 않으면 서버의 세션도 못쓴다.
* 이럴때 인증 및 인가를 어떻게 처리할까? *
📍 scale-out(서버의 개수를 늘리는 것)되었을 때, 세션을 통해 인증처리 방식
로드밸런서에 의해 부하를 분산하고, 클라이언트 요청에 매핑되는 서버가 랜덤하게 정해진다.
만약, 로그인 요청한 서버의 세션에 로그인한 정보가 저장되고, 이후 요청이 생겼다 했을 때,
로드밸런서에 의해 처음 매핑된 서버로 다시 매핑된다는 보장이 없다. (로그인한 흔적이 없을 수 있다.)
❓ 로드밸런서(Load Balancer)
: 여러대의 서버나 네트워크 자원 사이에 트래픽을 균등하게 분산시켜주는 기능
🖤 sticky session 기능이 있는 로드밸런서 처음 로그인 요청은 로드밸런서에 의해 랜덤으로(?) 매핑된다.
client1이 SB1에 매핑되었다고 했을 때, 이 매핑정보를 클라이언트 기기 안 저장소에 저장해둔다.
이후 모든 요청에 매핑정보가 담긴 스티커를 붙여, SB1과 매핑되어 해당 서버의 세션을 그대로 이용할 수 있다.
아니면, 외부저장소인 redis를 두고, 여기에 매핑정보를 저장한다. 모든 요청이 있을 때마다,
redis에서 매핑정보를 읽어 해당 서버로 매핑할 수도 있다.
로드밸런서에 의해 부하를 분산하고, 클라이언트 요청에 매핑되는 서버가 랜덤하게 정해진다.
만약, 로그인 요청한 서버의 세션에 로그인한 정보가 저장되고, 이후 요청이 생겼다 했을 때,
로드밸런서에 의해 처음 매핑된 서버로 다시 매핑된다는 보장이 없다. (로그인한 흔적이 없을 수 있다.)
❓ 로드밸런서(Load Balancer)
: 여러대의 서버나 네트워크 자원 사이에 트래픽을 균등하게 분산시켜주는 기능
🖤 sticky session 기능이 있는 로드밸런서 처음 로그인 요청은 로드밸런서에 의해 랜덤으로(?) 매핑된다.
client1이 SB1에 매핑되었다고 했을 때, 이 매핑정보를 클라이언트 기기 안 저장소에 저장해둔다.
이후 모든 요청에 매핑정보가 담긴 스티커를 붙여, SB1과 매핑되어 해당 서버의 세션을 그대로 이용할 수 있다.
아니면, 외부저장소인 redis를 두고, 여기에 매핑정보를 저장한다. 모든 요청이 있을 때마다,
redis에서 매핑정보를 읽어 해당 서버로 매핑할 수도 있다.
➼ 인증 및 인가 처리의 진화 (클라이언트: 안드로이드, IOS, 리엑트, 뷰, 앵귤러 etc...)
🦁 1세대(Generation) 방식
클라이언트 기기 안 저장소에 ID/PW를 저장해둔다.
모든 요청을 보낼때마다 이 ID/PW를 동봉📦해서 보내 인증처리한다.
⚠️ 해킹당했을 때, 비번을 바꿔야한다.
⚠️ 보안 측면에서 좋지 않다.
🦁 2세대(Generation) 방식
DB의 회원테이블에 unique한 값만 들어가는 key라는 column을 정의하고
회원 가입시, 이 컬럼에 unique한 값(ex. UUID)을 만들어 저장한다.
처음 로그인할 때 해당 회원을 DB에서 찾고, 해당 회원의 key column의 unique한 값(api key)을
클라이언트로 보낸다. 클라이언트는 그 api key를 기기 안 저장소에 저장해두고
모든 요청을 보낼때마다 api key를 동봉📦해서 보내 인증처리한다.
⚠️ api key가 해킹되더라도 key를 재생성하면 된다. (즉, 비번을 바꿀필요없다)
⚠️ 보안 측면에서 조금 더 낫긴 하지만, 여전히 비효율적 (요청 1000번, 네트워크 DB통신 및 SQL 처리 1000번)
⚠️ 성능측면에서 부담이 되진않는다.(보통 unique한 column에는 인덱스를 걸어놓기 때문에 SQL처리할 때,
full-scan이 일어나진 않는다.
* 하지만, 회원 인증하는데 있어 더 좋은 방법이 있을 것이다. *
클라이언트 기기 안 저장소에 ID/PW를 저장해둔다.
모든 요청을 보낼때마다 이 ID/PW를 동봉📦해서 보내 인증처리한다.
⚠️ 해킹당했을 때, 비번을 바꿔야한다.
⚠️ 보안 측면에서 좋지 않다.
🦁 2세대(Generation) 방식
DB의 회원테이블에 unique한 값만 들어가는 key라는 column을 정의하고
회원 가입시, 이 컬럼에 unique한 값(ex. UUID)을 만들어 저장한다.
처음 로그인할 때 해당 회원을 DB에서 찾고, 해당 회원의 key column의 unique한 값(api key)을
클라이언트로 보낸다. 클라이언트는 그 api key를 기기 안 저장소에 저장해두고
모든 요청을 보낼때마다 api key를 동봉📦해서 보내 인증처리한다.
⚠️ api key가 해킹되더라도 key를 재생성하면 된다. (즉, 비번을 바꿀필요없다)
⚠️ 보안 측면에서 조금 더 낫긴 하지만, 여전히 비효율적 (요청 1000번, 네트워크 DB통신 및 SQL 처리 1000번)
⚠️ 성능측면에서 부담이 되진않는다.(보통 unique한 column에는 인덱스를 걸어놓기 때문에 SQL처리할 때,
full-scan이 일어나진 않는다.
* 하지만, 회원 인증하는데 있어 더 좋은 방법이 있을 것이다. *
𐁍 JWT (JSON WEB TOKEN)
처음 로그인할 때, DB통신으로 얻은 회원객체를 Json으로 변환한다.
여기에 비밀번호를 걸어 암호화하고, 그 결과인 암호문을 얻어 클라이언트에 전달한다.
클라이언트는 기기 안 저장소에 해당 암호문(토큰🪙)을 저장해두고
모든 요청을 보낼 때마다, 토큰🪙 을 동봉📦해 보낸다.
(🪙 토큰: 특정 규칙에 맞게 생성된 문자열을 말한다.)
서버는 암호화할때 사용한 비번을 이용해서 복호화(?)하면 회원정보가 담긴 Json객체를 얻을 수 있다.
(서버는 이미 비번을 알고있다고 가정)
이렇게 하면 서버가 네트워크 DB통신을 하지 않고도 인증처리 할 수 있다.
DB통신 없이 CPU 연산만으로 인증하니까 속도가 훨씬 빠르다.
* 그렇게 얻은 Json객체가 유효한 정보인지를 어떻게 보장할까? *
복호화(?)하기위해 썼던 비밀번호가 내가 암호화했던 객체란것을 보장한다.
이같은 원리와 유사하게 JWT를 통해 인증처리한다.
여기에 비밀번호를 걸어 암호화하고, 그 결과인 암호문을 얻어 클라이언트에 전달한다.
클라이언트는 기기 안 저장소에 해당 암호문(토큰🪙)을 저장해두고
모든 요청을 보낼 때마다, 토큰🪙 을 동봉📦해 보낸다.
(🪙 토큰: 특정 규칙에 맞게 생성된 문자열을 말한다.)
서버는 암호화할때 사용한 비번을 이용해서 복호화(?)하면 회원정보가 담긴 Json객체를 얻을 수 있다.
(서버는 이미 비번을 알고있다고 가정)
이렇게 하면 서버가 네트워크 DB통신을 하지 않고도 인증처리 할 수 있다.
DB통신 없이 CPU 연산만으로 인증하니까 속도가 훨씬 빠르다.
* 그렇게 얻은 Json객체가 유효한 정보인지를 어떻게 보장할까? *
복호화(?)하기위해 썼던 비밀번호가 내가 암호화했던 객체란것을 보장한다.
이같은 원리와 유사하게 JWT를 통해 인증처리한다.
'Backend > 백엔드 필수개념' 카테고리의 다른 글
[Essential Concepts] 사설IP를 공인IP로 변환시키는 NAT(Network Address Translation) (0) | 2023.09.21 |
---|---|
[Essencial Concepts] 토큰 기반 인증방식 JWT와 OAuth (0) | 2023.07.16 |
[Essential Concepts] 프로세스와 스레드 및 컨텍스트 스위칭과 PCB (0) | 2023.07.16 |
[Essential Concepts] TCP와 UDP 및 OSI 7계층과 TCP/IP 4계층 (0) | 2023.07.16 |
[Essential Concepts] 자원의 이름으로 리소스를 식별하여 자원의 상태를 요청하거나 변경하는 REST API와 'RESTful' 하다 (0) | 2023.07.16 |
Comments