인증(Authentication) & 인가(Authorization)
- 인증과 인가는 API에서 가장 자주 구현되는 기능 중 하나이다.
- Private한 API는 물론이고 Public한 API도 기본적인 인증과 인가를 요구한다.
1) 인증(Authentication)
- 인증은 유저의 identification(ID와 PW 등)을 확인하는 절차이다.
- 인증을 하기 위해서는 우선 유저의 ID와 PW를 생성할 수 있는 기능이 필요하다.
로그인 절차
- 유저 아이디와 비번 생성
- 유저 비번 암호화하여 DB에 저장
- 유저 로그인 -> 아이디와 비밀번호 입력
- 유저가 입력한 비밀번호 암호화한 후 DB에 저장된 유저 비밀번호와 비교
- 일치하면 로그인 성공
- 로그인 성공하면 access token을 클라이언트에게 전송
- 유저는 로그인 성공 후 다음부터는 access token을 첨부하여 request를 서버에 전송함으로써 매 번 로그인해도 되지 않도록 한다.
유저 비밀번호 암호화
- 유저의 비밀번호는 절대 비밀번호 그대로 DB에 저장하지 않는다. (암호화 필수)
- DB가 해킹 당하면 유저의 비밀번호도 그대로 노출될 수 있기 때문이다.
- 또한 외부 해킹이 아니더라도 내부 개발자나 인력이 유저들의 비밀번호를 볼 수 있는 것을 방지하기 위함이다.
- 비밀번호 암호에는 단방향 해쉬 함수(one-way hash function)가 일반적으로 쓰인다.
- 단방향 해쉬 함수는 원본 메시지를 변환하여 암호화된 메시지인 digest를 생성한다.
원본 메시지를 알면 암호화된 메시지를 구하기는 쉽지만, 암호화된 메시지로는 원본 메시지를 구할 수 없어서 단방향성(one-way)이라고 한다.
- 예를 들어, "test password"를 hash256이라는 해쉬 함수에 사용하면 0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e 값이 나온다.
- 만일 "test password2"를 hash256 해쉬 함수에 사용하면 d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb 값이 나온다. 실제 비밀번호는 비슷하지만 해쉬 함수 값은 완전히 틀린 것을 볼 수 있다. 이러한 효과를 avalance라고 하는데 비밀번호 해쉬 값을 해킹을 어렵게 만드는 하나의 요소이다.
Bcrypt
JWT (JSON Web Tokens)
- 앞서 언급했듯이 유저가 로그인에 성공한 후에는 access token이라고 하는 암호화된 유저 정보를 첨부해서 request를 보내게 된다.
POST /auth HTTP/1.1
Host: localhost:5000
Content-Type: application/json
{
"username": "joe",
"password": "pass"
}
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E"
}
- 그러면 서버에서는 access token을 복호화하여 해당 유저 정보를 얻게 된다.
- 예를 들어 위의 access token을 복호화하면 다음과 같은 정보를 얻는다.
{
user_id = 1
}
- 복호화해서 얻은 유저 아이디를 통해 해당 유저가 누군지 알 수 있다.
- 이런 절차의 목적은 해당 유저가 매번 로그인 해도 되지 않도록 하는 것이다.
- access token을 생성하는 방법은 여러가지가 있는데, 그 중 가장 널리 사용되는 기술 중 하나가 바로 JWT(JSON Web Tokens)이다.

Why Use Access Token VS ID and Password?
- Performance
- No heavy bcrypt call, just a simple hash
- Client-side storage
- No actual ID and password stored in the client such as cookie.
- Also, token is very server specific - not reused in any other site.
2) 인가(Authorization)
- 인가는 유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차이다.
- 예를 들어, 해당 유저는 고객 정보를 볼 수 있는 있지만 수정 할 수는 없다 등.
- Authroization도 JWT를 통해서 구현 될 수 있다.
- access token을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한(permission)도 확인 할 수 있다.
Authorization 절차
- Authentication 절차를 통해 access token을 생성한다.
access token에는 유저 정보를 확인할 수 있는 정보가 들어가 있어야 한다. (예를 들어 user Id)
- 유저가 request를 보낼때 access token을 첨부해서 보낸다.
- 서버에서는 유저가 보낸 access token을 복호화한다.
- 복호화된 데이터를 통해 user id를 얻는다.
- user id를 사용해서 database에서 해당 유저의 권한(permission)을 확인한다.
- 유저가 충분한 권한을 가지고 있으면 해당 요청을 처리한다.
- 유저가 권한을 가지고 있지 않으면 Unauthorized Response(401) 혹은 다른 에러 코드를 보낸다.