인증과 인가
인증
사용자가 서비스를 사용할 때, 서비스에 가입된 회원을 확인받거나 권한 있음을 확인받는 과정.
인가
계속되는 인증 과정을 거치지 않아도 서비스를 제공하는 서버가 사용자에게 권한이 있음을 알게 하는 과정.
인증과 인가의 필요성
인증의 필요성은 말할 것도 없다. 서비스를 사용하기 위해선 서비스는 해당 사용자가 가입된 회원임을 확인받아야 하고 그 과정을 진행하는 것을 인증이라 한다. 즉, 로그인이다.
만약 인가를 해주는 기능이 없다면 회원만이 사용할 수 있는 서비스 기능을 사용하고자 할때 계속해서 인증 과정을 거쳐야 할 것이다. 티스토리를 예로 들자면 게시글을 작성할 때도 로그인을 해야 하고 댓글을 작성할 때도 로그인을 해야 할 것이며 어쩌면 게시글을 보는 것에도 로그인을 계속해서 해야 할 것이다.
인가 기능이 없을 때 서버와 사용자의 대화
사용자 : 게시글 쓸래요
서버 : 누구세요?
사용자 : 나 여기 회원인데.. (로그인)
서버 : (비밀번호 암호화 하고~ DB에 있는지 확인하고~ 권한 확인하고~) 로그인 되셨습니다~
사용자 : 이제 게시글 쓸게요~
서버 : 권한 있으세요?
사용자 : 다시 확인해 보세요.. (로그인)
서버 : (비밀번호 암호화 하고~ DB에 있는지 확인하고~ 권한 확인하고~) 권한 확인 되셨습니다~
기능 기능 마다 로그인 과정을 거쳐야 할 것이다.. ID, 비밀번호를 서버로 옮기는 작업, DB에서 해당 데이터를 확인하는 작업 등 꽤 많은 시간들이 소요되는 작업들이 반복된다. 그리고 불편하다!!
인가 기능이 있을 때 서버와 사용자의 대화
사용자 : 게시글 쓸래요
서버 : 누구세요?
사용자 : 나 여기 회원인데.. (로그인)
서버 : (비밀번호 암호화 하고~ DB에 있는지 확인하고~ 권한 확인하고~) 로그인 되셨습니다~ 토큰하나 드릴게요~
사용자 : 이제 게시글 쓸래요~ 여기 로그인할 때 받았던 토큰이요!
서버 : 권한 확인됐습니다~ 사용하세요~
JWT
JWT란?
토큰 기반 인증 시스템을 JSON을 활용하여 구현해 놓은 구현체
JWT의 특징
- 대부분의 언어가 지원
- C, Java, Python, C++, R, C#, PHP, JavaScript, Ruby, Go, Swift 등 주류 프로그래밍 언어 모두 지원
- 자가 수용적
- 토큰 정보, signature 등 토큰 기반 인증 시스템을 구현하는데 필요한 기능들을 모두 스스로 포함하고 있음
- 간단한 토큰 전달
- URL 파라미터, Rest 통신의 헤더와 같이 간편하게 값을 주고받을 수 있음
- URL 세이프한 값으로 인코딩
- URL에 값이 들어갈 수 있도록 =과 같이 URL에 포함되지 않는 특수 문자를 무시할 수 있음
JWT의 생김새
헤더와 페이로드, 그리고 시그니쳐를 온점(.)을 기준으로 나뉘어 가지고 있는 모습을 볼 수 있다.
그리고 각각 가지고 있는 정보를 살펴보면
- 헤더
- typ : 토큰의 타입을 나타낸다. jwt는 jwt!
- alg : 암호화에 사용된 알고리즘을 나타낸다.
- 페이로드
- 담고자 하는 정보를 JSON 형태로 저장할 수 있다.
ex) {firstname:jang, secondname:seonghyun}
- 담고자 하는 정보를 JSON 형태로 저장할 수 있다.
- 시그니쳐
- 정보의 인코딩값을 설정한 비밀키로 해싱 과정을 거쳐 붙인다.
-> 이 값을 통해 중간에 어떠한 이유로(해킹이라던지 사용자의 잘못된 사용이라던지) 임의의 수정이 발생했는지 확인할 수 있다.
- 정보의 인코딩값을 설정한 비밀키로 해싱 과정을 거쳐 붙인다.
이로써 인증과 인과 그리고 이를 간편하고 효율적으로 관리해 주는 JWT를 살펴보았다. 나는 이 모든 과정을 API Gateway 서버에서 진행하도록 설계를 한 경험이 있는데 이 방법이 맞는지는 정확히 모르겠다.
한 달 두 달 지날수록 열심히 한 프로젝트에 대한 기억조차 희미해지는 것이 안타깝지만 이러한 기록을 통해 더 오래 기억할 수 있도록 노력해야겠다.
'Study > Server' 카테고리의 다른 글
[Server] Go Web Server HTTPS 적용하기 (0) | 2022.06.07 |
---|---|
[Server] OAuth 알고 쓰기 (0) | 2022.06.02 |
[Network] HTTP란? 그리고 HTTP 1.1, HTTP 2 (0) | 2021.09.02 |
[Server] REST API란? REST API 알고 쓰기 (0) | 2021.08.31 |
[Server] APACHE와 NGINX의 특징과 차이 (0) | 2021.08.29 |