안녕하세요 오늘은 인증과 인가에 대해서 알아보려고 합니다. 인증과정으로 우리가 가장 익숙하게 접할 수 있는 것은 로그인이죠. 다른 유저들과 구분되는 id값과 그에 대응하는 보안코드인 비밀번호를 입력하죠. 이런 로그인이 우리에게 가장 친숙한 인증, 인가입니다. 그렇다면, 인증과 인가는 왜 필요한 것일까요? 인증은 관리자가 사용자에게 일방적으로 요구하는 것처럼보이지만, 사실 사용자에게도 중요하죠. 인증은 관리자가 서비스를 사용하는 유저를 통제하고, 어떻게 사용하는지 쉽게 파악하게 해줍니다. 이러한 장점으로 인해 사업적인 용도로 활용도 가능합니다. 특히 데이터가 중요해진 현대 웹 환경에서는 이러한 인가를 거쳐 구분된 개개인의 정보는 실물과 다름 없는 가치를 가지게 해줍니다.

1. 인증과 인가

앞서 말했듯이 사용자 입장에서는 인증이 개인의 보안을 위해 중요하고, 서비스 제공자는 사용자를 관리하기 위해서 중요합니다. 웹에서 정보는 http를 통해 문서 형식으로 전달됩니다. 이 과정안에서도 인증과 인가가 작동합니다. 특히 http가 가진 보안의 취약점을 개선한 https가 등장하면서 웹 환경에서도 나름 강력한 인증 시스템이 가능해졌죠.

2. 암호화는 어떻게 진행되는가?

암호화는 복원이 불가능한 단방향 해쉬가 적용됩니다. 한쪽 방향에서 통제가 가능하게 설계되어 관리가 편하도록 한 것이죠. 또한 이러한 일방향성으로 한쪽만 해독이 가능하니 복구화가 불가능합니다. 반면 양방향 해시는 복구화가 가능한 것을 의미하죠. 암호학적인 용도로는 복원 불가능한 단방향 해쉬가 많이 사용됩니다. MD5, SHA-1, SHA-256 등등이 우리가 사용하는 암호화 시스템입니다.

3. Salthing 과 Key Stretching

암호 형식이 일대일 대응으로 설계되면서 보안에 취약해지자 이를 해결하기 위한 노력이 계속되었습니다. 물론 오랜 시간 동안 해독 과정을 거치면 대부분의 암호가 풀립니다. 그러나 보안의 중점은 막는 것 보다는 최대한 늦게 해독하도록 억제하는 것에 있습니다. 이런 과정을 도와주는 것이 솔팅과 키 스트레칭입니다. 솔팅은 소금을 치는 것이라는 의미가 그대로 통하는데요. 암호 해싱 과정에 소금과 같은 임의의 값을 넣어 햇갈리게 하는 것입니다. 키 스트레칭은 늘인다는 의미처럼 해싱을 여러번 반복해 주는 거죠. 최근에는 Bcrypt라는 라이브러리를 통해 솔팅과 키 스트레칭의 도움을 받고 있습니다.

4. JSON Web Token

서버는 사용자가 로그인 했을 경우 headers에 메타 데이터를 보내서 확인합니다. 이 메타 정보를 JSON Web Token 일명 JWT라고 부릅니다. 로그인이 되면 백앤드가 토큰을 주고, 로그인이 선행되어야 하는 다른 기능이 요청 될 때, 토큰을 요청합니다.

JWT는 해더, 내용, 서명이라는 3가지로 구성됩니다. 해더에는 JWT임을 증명하는 정보가 담깁니다. 내용(payload)에는 만료시간, 유저에 대한 정보 등이 담기죠. 여기에는 실제 개인 정보가 아닌 id등 위험하지 않은 값만 담겨야 하는데요. 내용 자체가 암호화 되어있다고 하더라도 유출의 위험이 있는 정보는 담지 않는 것이죠. 마지막으로 서명은 서비스 제공자가 직접 발급한 토큰인지 확인하는 부분입니다. 만약 네이버의 가입자가 네이버로부터 토큰을 받았다면, 서명을 통해 이는 네이버에서만 활용이 되죠. 정보는 같다고 하더라도, 구글과 다음의 토큰은 이 서명이 달라 구분 할 수 있습니다.

Tags:

Categories:

Updated: