[TIL-230827] 인증과 인가
1. 인증이란?
유저가 누구인지 확인하는 절차
예를 들어 ID와 PW를 통해 로그인하는 행위
2. 인가란?
인증 이후의 프로세스
사용자가 어떤 자원에 접근할 수 있는지 확인하는 절차
3. 인증과 인가를 처리하는 방법 Token
다양한 Token이 있지만 가장 많이 사용되는 Token은 "JWT"이다.
JWT의 구성요소
- Header: Token 유형, 서명 알고리즘(HS256 or RSA등)이 담긴다.
- Payload: Claim이 포함되는 영역으로 전송하고자 하는 여러 데이터가 담긴다(Claim 유형: Registered/Public/Private)
- Signature: Base64로 인코딩된 Header, Payload와 서버만이 가지고 있는 비밀 키를 설정한 알고리즘으로 암호화 값이 담긴다.
각 영역들은 "."을 구분자로 아래 예시처럼 생성된다.
https://jwt.io/#debugger-io 사이트에서 생성해볼 수 있다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 //Header
.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6InNveWVvbmciLCJpYXQiOjE1MTYyMzkwMjJ9 //Payload
.j8Vdu_-MGLtrfoWlXqkDPCTGu0iM4phqaMgqMklmg_8 //Signature
'JWT'를 쓰면 인가가 수월하다. 서버가 유저 정보를 갖고 있으므로 데이터에서 유저의 권한 정보도 읽어들이면 됨.
'Access Token'을 통해 해당 유저 정보를 얻을 수 있으므로 해당 유저가 가지고 있는 '권한' 확인 가능하다.
JWT의 저장 장소
Local Storage와 Cookie
인증과 인가를 구현하는 방법
1. Controller 내부에 구현
대부분의 Controller 메서드에 중복된 코드가 존재하게 되고 수정이 필요하다면 번거로운 반복 작업이 이어진다.
2. Interceptor / Filter
3. Spring Security
4. API Gateway
API Gateway에서 공통 로직을 처리한 후, MicroService에 도달하도록 한다.
인증 절차
1. 인증 절차를 통해 Access Token을 생성한다. Access Token에는 유저 정보를 확인할 수 있는 정보가 들어가 있어야 한다. (예를 들어 User Id)
2. 유저가 Request를 보낼 때 Access Token을 첨부해서 보낸다.
3. 서버에서 유저가 보낸 Access Token을 복호화 한다.
4. 복호화된 데이터를 통해 User Id를 얻는다.
5. User Id를 사용해서 DB에 있는 유저의 권한을 확인한다.
6. 유저가 충분한 권한이 있으면 요청을 처리한다.
7. 유저가 권한을 가지고 있지 않으면 Unauthorized Response(401) 혹은 다른 에러 코드를 보낸다.
Reference
https://stackoverflow.com/c/wecode/questions/125