네이버 로그인 API 호출 시 요구되는 파라미터로 넣을 토큰을 생성해야한다.
이 토큰은 CSRF 공격을 방지하기 위해 필요한 토큰으로 추후 인증 과정의 결과값으로 전달되는 세션 토큰과 일치하는지 확인해서 정상적인 요청인지 검증하는 용도로 사용된다.
CSRF 공격 방어법 중 난수값 검증 방법을 사용한 것이다.
상태 토큰은 네이버 로그인을 진행하는 동안 유지되어야하며 고유한 값이여야만 한다.
아래는 CSRF 방지를 위한 상태 토큰 생성 예시 코드이다.
// 상태 토큰은 추후 검증을 위해 세션에 저장되어야 한다.
public String generateState() {
SecureRandom random = new SecureRandom();
return new BigInteger(130, random).toString(32);
}
// 상태 토큰으로 사용할 랜덤 문자열 생성
String state = generateState();
// 세션 또는 별도의 저장 공간에 상태 토큰을 저장
request.session().attribute("state", state);
return state;
https://nid.naver.com/oauth2.0/authorize
?client_id={클라이언트 아이디}
&response_type=code
&redirect_uri={개발자 센터에 등록한 콜백 URL(URL 인코딩)}
&state={상태 토큰}
```
{개발자 센터에 등록한 콜백 URL}?state={상태 토큰}&code={인증 코드}
```
https://nid.naver.com/oauth2.0/token
?client_id={클라이언트 아이디}
&client_secret={클라이언트 시크릿}
&grant_type=authorization_code
&state={상태 토큰}
&code={인증 코드}`
{
"access_token": "AAAAQosjWDJieBiQZc3to9YQp6HDLvrmyKC+6+iZ3gq7qrkqf50ljZC+Lgoqrg",
"refresh_token": "c8ceMEJisO4Se7uGisHoX0f5JEii7JnipglQipkOn5Zp3tyP7dHQoP0zNKHUq2gY",
"token_type": "bearer",
"expires_in": "3600"
}
https://openapi.naver.com/v1/nid/me
Authorization: Bearer {accessToken]
{
"resultcode": "00",
"message": "success",
"response": {
"email": "openapi@naver.com",
"nickname": "OpenAPI",
"profile_image": "https://ssl.pstatic.net/static/pwe/address/nodata_33x33.gif",
"age": "40-49",
"gender": "F",
"id": "32742776",
"name": "오픈 API",
"birthday":
"10-01"
}
}
- 서비스 자체 구현
- 인증용 JWT토큰 반환
- 카카오와 달리 서비스 연결 끊기 API는 존재하지 않으므로 그냥 탈퇴 처리를 진행하면 된다.